Безопасность информационных систем: Атака клонов




Принцип обмена данными из 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='\

25 Comments

  1. mihenius

    Не стоит забывать еще и решения на основе SQL

    http://ivn73.tripod.com/new_1s.htm

    Так же есть «радикальное» решение на основе тонких клиентов и отдельной подсети (там украсть что-то просто неоткуда, только если распечатать или сфот-ть с монитора, правда узким местом будет админ и прог, но они всегда явл. узким местом)

    Еще можно пригласить грамотного админа, настроить групповые политики и логирование + длл от ромикса на запрет открытия внешних ерт (хотя дырки все равно остануться)

    Reply
  2. support

    1) Спасибо за ссылку. Очень интересный материал.

    Reply
  3. CheBurator

    > на запрет открытия внешних ерт

    ставим формекс и перехват открытия внешних отчетов.

    Reply
  4. support

    CTRL+O

    Reply
  5. JohnyDeath

    support, ты это про что? Думаешь так можно перехитрить ФормЭкс?

    Чебурашка правильно сказал: «Ставим и радуемся». Тем более, что в данном случае нужна всего лишь одна глобальная предопределённая процедура:

    СИНТАКСИС:

    Процедура ПриЗагрузкеВнешнегоОтчета(<ИмяФайлаОтчета>)КонецПроцедуры

    ЗАМЕЧАНИЕ:

    Если в процедуре установить статус возврата в ноль, то внешний отчет не будет загружен.

    Reply
  6. АЛьФ

    Мне почему-то кажется, что народ путает собственно информационной системы (конфигурации) и ее наполнение (базы данных).

    Это ж два практически не связанных случая. И комплексная защиты в форме должна покрывать их оба. Но средства для защиты от каждого случая будут свои.

    И надо помнить, что не существует инструмента или метода, использование которого решит все проблемы с защитой одним махом. Нужно использовать многоуровневую защиту и не пренебрегать административными методами.

    Reply
  7. mihenius

    Никто ничего не путает 😉

    Просто в контексте статьи идет разговор о воровстве мд-ка возможно с данными

    Я и расписал какие есть способы предотвратить подобное.

    КЗК же защищает конфигурацию от воровства при распространении ее клиентам.

    Т.е. сама статья описывает немного не то, что защищает КЗК 😉

    Reply
  8. mihenius

    1 уровень это хорошо настроенное логирование с оповещением

    Если начинают воровать к ним уже идет отдел безопасности

    Например простейшее решение. В словаре меняем пути на другой каталог. В текущий каталог кидаем дбф-ки из демобазы. Настраиваем логирование действий с подставными файлами. Правда инсайдер может просмотреть словарь, но админ может много чего сделать чтоб инсайдер этого не смог.

    Reply
  9. АЛьФ

    2(7) Вот именно что путаешь. Где в статье речь про данные? Речь там про «информационную систему», и данные тут не упоминаются вообще. Зато постоянно говорится о конфигурации. Или мы разные статьи читаем? 🙂

    КЗК же защищает конфигурацию не только от клиентов. У меня больше половины клиентов — это фирмы, которые вложились в разработку конфигурации и не желают отдавать эти наработки конкурентам. Кстати, это меня самого удивило. Но, мои слова по этому поводу в статье уже процитированы 🙂

    2(8) Еще раз: в данном контексте «информационная система» — это не столько данные, сколько бизнес-процессы, которые в конфигурации реализованы (пусть Доржи поправит меня, если я неверно трактую вкладываемый им смысл статьи). И полностью полагаться на один метод защиты, как я уже говорил, в корне неправильно. Должен быть комплексный подход.

    Reply
  10. coder1cv8

    Надоели уже со своим КЗК, чесслово… Семерка потихоньку отмирает и с этим ничего не поделаешь… А в восьмерке, в БОЛЬШИНСТВЕ случаев, встроенной защиты хватает…

    Reply
  11. АЛьФ

    2(10) Ну, «отмирать» семерка будет еще ооочень долго. Или ты считаешь, что все, кто вложил несколько сотен тысяч баксов в автоматизацию на семерке с радостью кинутся вкладывать новые сотни в переход на восьмерку? Если так, то значит ты очень недолго еще работаешь в этой сфере 🙂

    Reply
  12. Abadonna

    (10) В гробу я видал эту восьмерку, которая умудрилась лечь от их же стандартной ОСВ по счету.

    Причем ложилась и 8.0, и 8.1. Пусть дозреет сперва

    Reply
  13. coder1cv8

    (11,12) Обычный подход семерочников 🙂

    Reply
  14. АЛьФ

    2(13) Ну, у тебя-то не менее обычный подход «восмерочников». Я тебе могу процитировать одно интересное высказывание:

    «Полезная вещь думаю. Но как библиотека для 7.7. для нас уже устарела. Альф, если серьезно работаете с ней, продумайте вариант на 8-ку»

    Это 2003-й год. Реакция на выход первой версии КЗК. И знаешь, с тех пор ни чего не изменилось. Семерку все так же хоронят, но она продолжает успешно продаваться и внедряться. Под нее все так же пишут новые проекты. И КЗК с тех пор так же пользуется неплохим спросом.

    Так что может не стоит все же уверять всех в том, что «семерка потихоньку отмирает», а имеет смысл взглянуть реальности в глаза? 🙂

    Конечно, прогресс не остановить и семерка в тоге уйдет с рынка. Но будет это совсем не так скоро, как хотелось бы некоторым. И только из-за того, что 1С увериться в полной готовности восьмерки и захочет убрать внутреннюю конкуренцию продуктов. Т.е. уберет семерку директивно, а не по воле рынка.

    ИМХО, конечно.

    Reply
  15. poppy

    (14)

    > И только из-за того, что 1С увериться в полной готовности восьмерки и захочет убрать

    > внутреннюю конкуренцию продуктов. Т.е. уберет семерку директивно, а не по воле рынка.

    В одинесе уж серьезно считают, что семерка тормозит рост темпов продаж восьмерки. ИМХО полным ходом разрабатываются меры по формированию «правильной» воли рынка… 😉

    Reply
  16. АЛьФ

    2(15) Если уж им это с шестеркой не удалось, то с семеркой не получится тем более.

    Reply
  17. poppy

    (16)

    Что с шестеркой не удалось? Мне казалось, что все удалось…

    Reply
  18. АЛьФ

    2(17) В курсе сколько шестерку вытесняли с рынка? А то, что до сих пор ее некоторые используют и отчетность для нее делается? Семерку еще сложней будет вытеснить. Практически нереально.

    Reply
  19. avhrst

    В статье было правильно сказано «для малого и среднего бизнеса», к сожалению для больших компаний 1С не подходит не по скорости, не по защите.

    Reply
  20. АЛьФ

    2(19) Всего лишь вопрос маркетинга. Были бы усилия направлены в этом направлении от самой 1С, сразу стало бы подходить и по скорости, и по защите 🙂

    Reply
  21. poppy

    (18)

    То, что под шестерку делают отчетность — это понятно. Шестерка — культовая программа. Говорим «1С», подразумеваем «1С:Бухгалтерия 6.0».

    Это имиджевая версия и отказ от ее поддержки не влучшую сторону сказался бы на репутации фирмы.

    Вытесняли ли шестерку с рынка? Непомню каких либо активных действий… Единственное, что было — это выпуск специальной конфигурации, такой же простой как и шестерка.

    Версию 7.5 — точно вытесняли. Объявили цену перехода на 7.7 в $40 в течении ограниченного времени. Кто не успел тот опоздал.

    Будут ли семерку поддерживать как шестерку или заманят пользователей на 8.0 большой скидкой? Незнаю… Поживем, увидим.

    Переход пользователей на очередную версию — процесс небыстрый. Кстати, сегодня видела компанию, которая работает еще на первой редакции ТиС.

    Reply
  22. АЛьФ

    2(21) Шестерка — имиджевая и культовая?! Это даже не смешно. А с рынка ее очень даже усиленно вытесняли.

    Reply
  23. Abadonna

    (13) Ты стрелы попутал, я не семерочник, а ПРОГРАММИСТ

    Reply
  24. a.v.petuhov

    В новой версии платформы «1С:Предприятие 8.0/8.1» описанная уязвимость системы устранена, за счет встроенного механизма сборки конфигурации без исходных кодов.

    Ну-ну, есть такое, вот только уже месяцев 6-7 в свободном доступе есть декомпилятор исходных кодов. Так что спрятать штаными средствами 8.0/8.1 исходные коды все равно не получится.

    Reply
  25. d.snissarenko

    Поучительно для не просвященных.

    81 серверный вариант — утянуть сможет только чел с полными правами 1с или админ сервера (пасворт на скуль БД не вопрос), а вот простой сотрудник уже вряд-ли.

    Reply

Leave a Comment

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