Снятие-восстановление паролей пользователей в 1С:Предприятие 7.7




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

38 Comments

  1. LeXXeR

    Соарон рулит! 😉

    Reply
  2. vcv

    А зачем обработка, если каждый уважающий себя одинэсник просто обязан иметь в потайном кармане пропатченное portable ядро 1С, которому все пароли по барабану.

    Reply
  3. Timesoft

    А зачем таскать в потайном кармане контрафакт, если в 7-ке отключить пароли пользователей можно переносомпереименованием одного файла в базе ???????

    Reply
  4. vde69

    для обработки необходимо запретить скачивание с рейтингом меньше +3 (что-бы юзвери не тянули).

    а вообще совершенно бесполезная вещь, замену хешей паролей я и без внешних DLL напишу за пару часов, только не нужно это вообще…

    делается через копипасте в конфигураторе вполне штатным режимом копирование учетки, потом сброс пароля, а при необходимости востановления назад, простое «вставить». Добавлю, что скопированые учетки можно хранить в копии базы.

    Reply
  5. samadurov

    (3) Если в организации более 50 информационных баз и не все пользователи на месте, чтобы узнать пароль для входа, то лазить в каждую базу и переименовывать папку usrdef очень утомительно…

    Reply
  6. samadurov

    (4) для начала в конфигуратор войти надо… Ну, а если есть время, то пишите, как говорится, Шура, пишите!!!

    Reply
  7. vde69

    (3) а зачем вообще надо знать пароль пользователя? не надо!!! если пользователи забывают свои пароли — это их проблеммы (у меня вообще вин авторизация давно везде http://infostart.ru/projects/2836/ )

    (4) если права на папку UserDef есть — войду без проблемм, если нет — то и твоя шняга не поможет (или поможет ?)

    ————————————————

    кроме того на сколько я понимаю механизм паролей в 7.7, просто распарсив файлы можно получить только хеш MD5, (при запущеной 1с можно взять открытый пароль текущего пользователя), так, что ты в любом случае не получаешь пароль, а только временно можешь войти под конкретным пользователем, а это расцениваеться как ВЗЛОМ сесии, и уж выкладывать кряк, которым могут тупые звери пользоваться — я-бы не стал, ведь далеко не везде UserDef только на чтение установлен 🙂

    Reply
  8. saba1960

    Полезная обработка. Я довольна!

    Reply
  9. RandomDV

    (1) Не всегда можно ставить чего хошь.

    (2) Самый норм. вариант.

    (3) Под SQL ? Ну-ну. Чревато потерей настроек соединения с SQL сервером.

    Reply
  10. Steamroller

    Бесполезная обработка, поскольку снять/восстановить пасс юзера в семёрке это весьма простое дело. Причем вариантов довольно много. Можно удалить известный файл, заменить хэш, или организовать атаку по типу MD5 по извлеченному хэшу пароля пользователя, это если нужно получить пасс.

    Reply
  11. Джиневра

    Убойная штука :)) Плюс!

    Reply
  12. Sonia

    Может пригодиться. Удобно. Плюс!

    Reply
  13. Abadonna

    (9)>Под SQL ? Ну-ну. Чревато потерей настроек соединения с SQL сервером.

    С каких это щей? 1Cv7.DBA никакого отношения к users.usr не имеет

    Reply
  14. samadurov

    (13) Извините, обработка написана только для DBF.

    Reply
  15. Valera_ch55

    Спасибо! За работу +

    Reply
  16. isp655

    полезная штука! спасибо!

    Reply
  17. Ramzay

    Мне навеное должно быть стыдно, но я не знаю что это за «известный» файл, в котором храняться пароли. Можете подсказать, буду благодарен.

    А обработка мне понравилась. Просто и понятно.

    Reply
  18. samadurov

    (17) Извините за долгое молчание. Был в отъезде. А файл, где хранятся пароли пользователей находится в папке USRDEF и называется users.usr

    Reply
  19. Ramzay

    users.usr — буду знать. Спасибо.

    Reply
  20. DRY

    вот если бы еще пороль на автора конфигурации показывался.. эх..

    Reply
  21. kadra

    Обработка понравилась. Нужна в работе

    Reply
  22. ChessCat

    (13) >1Cv7.DBA никакого отношения к users.usr не имеет

    еще как имеет

    попробуй в конфигураторе в списке пользователей ИБ изменить список пользователей чтобы ПЕРВЫЙ по списку стал другой (например первый в списке был Вася, а после изменения списка пользователей первым стал Петя). И после сохранения списка пользователей получишь сброс настроек к SQL серверу (пустой 1Cv7.DBA)

    Иногда для получения такого эффекта достаточно просто отсортировать список пользователй по алфавиту и сохранить (первым становится другой — и все, получите пустой 1Cv7.DBA)

    Reply
  23. Abadonna

    (22)>»попробуй в конфигураторе в списке пользователей ИБ изменить список пользователей чтобы ПЕРВЫЙ по списку стал другой»

    Не поленился попробовать. Первым стоял AUTOPILOT, удалил нах, как был DBA так и остался, как были параметры соединения с базой, так и остались.

    Ты сам придумал, или приснилось?

    Reply
  24. vip

    (22)(23) Сброс 1Cv7.DBA происходит когда users.usr правится при запущенном конфигураторе.

    Поэтому перед любыми действиями с users.usr надо проверять, запущен ли конфигуратор.

    А вот как проверять, могу продать за пару пива.

    Reply
  25. Abadonna

    Я В КОНФИГУРАТОРЕ УДАЛИЛ/СОХРАНИЛ. Совойства коннекта остались прежними

    Reply
  26. vip

    (25) Ты поступил абсолютно штатно.

    При этом ничего не слетит.

    Я о том, что если из режима Предприятия изменить users.usr при запущенном Конфигураторе, то свойства коннекта слетят.

    Reply
  27. Abadonna

    >Я о том, что если из режима Предприятия изменить users.usr

    ТАКОЙ изврат мне бы и в голову не пришел, хотя, как ты в курсе, я это паршивенький компаунд раздербанил давным-давно, да и не один я…

    Reply
  28. whtblck

    прикольно, спасибо

    Reply
  29. chsm

    Спасибо, пригодилось, вовремя

    Reply
  30. artnet

    Ну подскажите дураку-куда эти 3 файла надо скопировать…

    Или чего ещё с ними сделать?Я ни фига не понимаю…

    Reply
  31. samadurov

    (30) Задавая вопрос о трех файлах Вы имели ввиду FormEx.dll, UsersDef.dll и сам файл обработки СнятьВосстановитьПарольЮзера.ert? Если так, то файл обработки нужно поместить в папку ExtForms информационной базы, а файлы внешних компонент FormEx.dll и UsersDef.dll — в саму папку с информационной базой…

    Reply
  32. artnet

    Скопировал…А дальше то чего делать?

    Вообще задача-из старой базы,пароли которой давно утерены(в связи с уволнением сотрудника)вынуть номенклатуру…

    Может есть простые пути?Помогите.

    Reply
  33. samadurov

    (32) Самый простой путь — в папке с информационной базой переименовать папку USRDEF, например, в USRDEF1. И тогда можно войти в базу без авторизации пользователей

    Reply
  34. artnet

    (33)Спасибо!Переименовал.Виста написала-«Программа остановлена,начинаю сбор информации…»

    Другая база запускается без проблем.

    Reply
  35. Ivanov_OM

    Хорошая обработка.

    Но можно все сделать проще.

    Reply
  36. Kristi74

    Когда столкнулся с такой проблемой, поиски привели к определенному файлу, удаление которого и сняло все пароли.

    Reply
  37. samadurov

    (36) Понятно, что удалив файлик можно решить проблему. Но, это слишком «топорно», не этично и не красиво по отношению к держателям баз.

    Reply
  38. Kristi74

    (37) samadurov. Забыл пароль — 2 минуты и все готово. Конечному пользователю как-то все равно насколько этично я это сделал, ему важен результат и всё. Платят тоже только за результат, а не за красоту проделанной работы. Пришел, молча все сделал и ушел. Ничего более. Это специалисты могут между собой соревноваться в красоте, изящности и гибкости решения проблемы. А насчет «не красиво по отношению к держателям баз», некрасиво пароли забывать, в крайнем случае ведь можно и записать куда нибудь.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *