<?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='\
Интересная тема. Спасибо автору за исследование.
В 1С нет подобного, т.к. отсутствует необходимость. Двухфакторная аутентификация нужна там, где проходной двор. А бухгалтеры обычно сидят во внутренней ЛВС, в отдельном кабинете с усиленной дверью (ибо касса тоже рядом). Внедрив подобное, можно заработать много очков в минус карме от тех же бухгалтеров, кому нужен лишний геморрой при входе в программу.
(1) tkv44, Тема действительно интересная, а применять двухфакторную аутентификацию можно например при работе через веб клиент и предоставлении доступа сторонним лицам.
(1) tkv44, (2) Zhilyakovdr,
Спасибо за оценку, на выходных, возможно, в конце статьи размещу пару-тройку скриншотов , чтобы прояснить как заводить секретный ключ в телефон( один человек подсказал),
сильно подозреваю, что тем кто не пробовал двухфакторную аутентификацию через приложение тяжело понять с ходу преимущества.
Меня это «очень сильное колдунство» просто заворожило )).
А вообще вы правы для веб интерфейса это самое то. Если открыт доступ снаружи без дополнительных мер защиты. Защита паролем слаба, угонят пароль на раз, особенно если заходят из «опасных» мест. Также очевидно, что можно использовать этот принцип не на начальной авторизации, а уже внутри программы для доступа например к проведению определенных документов итд.
Вообще функцией HMAC( Знач Ключ, Сообщение ) как раз таки и можно формировать подписи любых данных тк это «..один из механизмов проверки целостности информации, позволяющий гарантировать то, что данные, передаваемые или хранящиеся в ненадёжной среде, не были изменены посторонними лицами…» она же выполняет отчасти некоторое исправление против слабых(коротких) ключей и слабых(коротких) сообщений. Хотя для этих целей в 1С есть более продвинутый объект МенеджерКриптографии.
(0) тема интересная (в декабре была подобная задачка, пока ее временно отложил), опишите пожалуйста как выглядит процесс. Вот пользователь подошел к компьютеру, включил компьютер, ввел пароль от windows, дальше запускает 1с и что происходит далее? так же интересует вопрос возможно ли навесить определенное ограничение на доступ? К примеру, у пользователя нет прав на проведение документа, а тут пришел админ с волшебной флешкой и провел документ через рабочее место пользователя.
Я правильно понимаю, что когда открывается форма «Обработка.ДвухфакторнаяАутентификация.Форма.ФормаПроверки» пользователь фактически залогинен и ему осталось закрыть это окно, чтобы можно было продолжить работать?
(5) I_G_O_R,
Если он его закроет закроется 1С. Он должен либо ввести корректный одноразовый пароль который все время меняется либо не зайдет.
(6) Форму можно закрыть без последствий, или даже вообще не открывать, в браузере можно выполнить свой javascript, ну или подменить javascript. Для взломщика это не будет проблемой, значит толку от такой защиты нет совсем. Чтобы защита реально работала, нужно использовать РЛС в зависимости от параметра сеанса, а значение параметра сеанса должно зависеть от ввода кода.
(7) I_G_O_R,
Во первых здесь рассматривается механизм работы с одноразовыми паролями, связка 1С — генераторы паролей. как вы в дальнейшем это используете ограничено только вашей фантазией.
можете даже
во вторых Вы сможете обойти примитивнейшее?
и событие
? Самому интересно посмотреть, про SSL не забудьте. )).
и еще напомню это вторая часть авторизации первую стандартную никто не отменял.
(8)
Разумеется. Не трогаем форму 2ФА, жмем F1 — открываем справку. Жмем «перейти по ссылке», набираем что-то типа «e1cib/list/Справочник.Справочник1». Работаем со справочником.
http://forum.infostart.ru/forum87/topic150805/ .
Взял отсюда:
Это говорит только о том, что решение должно быть чуточку сложнее. Но в целом — мне лично понравилось. Жму звезду.
(9) утюгчеловек,
это говорит что у меня и у 1С разные понимания ключа
, думаю что рано или поздно 1С исправит этот недочет.
За звезду спасибо!
Добрый день. Приобрел обработку, дт-шник, лайкнул… но что-то не получается ввести правильный код.
Порядок действий сделал такой:
1. Открыл под Админом в базе обработку. Создал секретный ключ.
2. Скачал Google Authenticator. Сканировал им QR код из обработки.
3. Ввожу пароль из приложения в 1С. Ругается что неверный пароль.
4. Время одинаковое между компом и телефоном. По крайней мере по минутам точно.
В чем может быть причина?
(11) Добрый день,
1. Чтобы не было вопросов к синхронизации времени поставьте на смартфоне «синхронизировать время по сети»,
«использовать 24-часовой формат» , и «использовать часовой пояс сети» , тоже самое на ПК. и попробуйте снова создать 2фа.
2. Используйте на смартфоне генератор паролей Freeotp
https://play.google.com/store/apps/details?id=org.fedorahosted.freeotp
3. При создании, попробуйте не сканировать, QRкод, а набрать его в приложение вручную. Если благополучно создали на пользователе 2фа то в дальнейшем это проблемы с паролем это только рассинхронизация времени.
и пишите в ЛС.
Функция МассивВДвоичныеДанные без COM для 8.3.6 и выше:
Показать
Генерация QR-кода на сервере linux без БСП:
Показать
(13) Да, спасибо, давно делал, кажется в момент публикации эти объекты уже появились, переделывать было некогда, будет время обновлю обязательно!
Подскажите пожалуйста как сделать что бы пароль был 4-х значный и интервал на вводне 30 секунд, а например 60.
Что-то не пойму.
(16) все в коде есть, смотрите внимательней. Какой одноразовый пароль на мобильном устройстве создает генератор оп? в 1С под него подстраивайтесь.