Защита внешней обработки — прячем и шифруем макет




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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='\

32 Comments

  1. Поручик

    А теперь самое главное: раскрыли модуль, увидели пароль зипованного макета, и все ваши выкрутасы с шифрованием-дешифрованием — коту псу под хвост 🙂

    Годится для чайников, чисто как пример работы с внешними макетами и архивами.

    Reply ↓
  2. ll13

    (1) Вы не открыли Америки, в начале статьи собственно это и написано.

    Для кого псу под хвост, для кого коту под хвост http://ru.wiktionary.org/wiki/%D0%BA%D0%BE%D1%82%D1%83_%D0%BF%D0%BE%D0%B4_%D1%85%­D0%B2%D0%BE%D1%81%D1%82

    Reply ↓
  3. Поручик

    (2)

    Статья нуждается в доработке.

    Это незаконченная статья. Вы можете помочь проекту, исправив и дополнив её.
    Reply ↓
  4. alexk-is

    Тексты модулей можно раскрасить получше 🙂



    Процедура КнопкаВыполнитьНажатие(Кнопка)

        
    Печать(«ШифрованныйМакет»);

    КонецПроцедуры

    Reply ↓
  5. ll13

    (4) Расскажите как Вы текст раскрашиваете ?

    А то я искал, так и не нашел… 🙁

    Reply ↓
  6. Поручик

    Разукрашка

    http://infostart.ru/public/19856/

    Reply ↓
  7. ll13

    (6) Спасибо)

    Reply ↓
  8. Душелов

    Эта защита от кого? От разработчика? Эту «защиту» он обойдет за 10-60 минут (в зависимости от опыта).

    От пользователя — и пароля хватит.

    Reply ↓
  9. Rusk51

    (8)+ А пользователю макет и даром не нужен 😉

    Reply ↓
  10. Tatitutu

    Змейка

    😀 посмотри как эта обработка закрыта.

    Паролей нет, удали в модуле весь код и запусти, удали все и запусти — результат тот же — все работает.

    День ушел , чтобы найти и понять (как это сделано и самое главное как так сделать)

    Reply ↓
  11. ll13

    (10) Я то думал что этот фокус(внешняя обработка без текста модуля) уже все знают ))

    Как так сделать знал уже давно, будет время статейку напишу.

    На вскрытие ушло 30 секунд )

    Reply ↓
  12. Abadonna

    (9)

    А пользователю макет и даром не нужен

    Знаю я пользователей, которые лихо с макетами расправляются. Особых знаний там же не нужно.

    Reply ↓
  13. Душелов

    (12) Таким в конфигураторе делать нечего.

    Reply ↓
  14. Abadonna

    (13)

    Таким в конфигураторе делать нечего.

    Ну прям! Им надо дожидаться «мальчиков» из франчей?

    Вот, что пишет мне одна очень продвинутая бухгалтерша:

    Наталья Энерго (11:24:00 11/03/2010)

    так вот именно. Ну, а кто работает в 1С-БИТ, это и так все знают. Берут людей без ничего и с улицы, (не говоря уже о том, что вчера этот мальчик просто откровенно делал все ПО БУМАЖКЕ)

    😉

    Reply ↓
  15. Душелов

    (14) Ну молодец, что по бумажке!

    Reply ↓
  16. larisab

    (14) Мы где-то уже обсуждали этот вопрос. Филиалы московского БиТа — это продажи коробок и ИТС-сервис. Платят там мало, работают одни студенты. НЕ ВСЕ франчи такие 😉

    Reply ↓
  17. Abadonna

    (16) Это КРАСНОЯРСКИЙ БИТ был;)

    Reply ↓
  18. larisab

    (17)

    Это КРАСНОЯРСКИЙ БИТ был

    Он филиал московского БиТа.

    И у нас такой же 😉

    Reply ↓
  19. iov

    хм ….

    была как-то проблема…. Ставлю прогу а она не ставится говорит что dll заменить не может…

    Прога перед установкой в темп дир распаковывалась быстро так и удалялась также… Так вот помогли мне права на папочку нужные выстваить…и вуаля…. все что распаковала удалить не может… а тама dll старую поменял на новую и запустил повторно установочку…

    Мысль ясна?

    чем отследить файловую активность расказывать надеюсь не нужно….

    А самое главное что сохранить печатную форму и сделать из него макет….

    ну скажем так… Вот за публикацию потенциально «НЕБЕЗОПАСТНОГО» кода +

    За то что не знал что этим на ура пользуются «-» (в любой закрытой обработке может размещаться подобная схема и внедрять в систему реальную угрозу вашим данным)

    Но в целом за позитивчик «+»

    Reply ↓
  20. Душелов

    (19) >в любой закрытой обработке может размещаться подобная схема

    Не надо открывать такие закрытие разработки. Или предварительно распаковывать их смотреть код.

    Reply ↓
  21. iov

    (20) Именно так 😉 Но как поется в одной старой но до сих пор актуальной песне — «будь осторожен ❗ «. И не все помнят это и порой случается что фирма как то резко сдала позиции конкуренту….

    Reply ↓
  22. iov

    Был знаком с человеком который распространил одну обработку которая хранила в себе вредную штуку (которая ждала команды хозяина с определенного ресурса) , но надо было такому случится что именно в этой вредной штуке он ошибся одной буквой c и с (и получить отклик смог а вот выполнить удаленно код уже нет). Так он распространил хорошую весчь просто так…

    И это можно сказать веселая история. наверно единственная… Потому что остальные истории заканчивались не очень хорошо для невнимательных.

    Reply ↓
  23. WellMaster

    (11)

    «На вскрытие ушло 30 секунд )»

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

    Reply ↓
  24. awa

    (23) Найдётся всё!

    Надеюсь, это не является нарушением правил))

    Reply ↓
  25. bulpi

    (10)

    Я не понял, что Вас так поразило в обработке Змейка? Ничего особо странного я там не заметил 😳

    Reply ↓
  26. ll13

    (10),(25) Да, да кстати расскажите что необычного в игре змейка, может я что интересное не заметил(без шуток). Сейчас как раз во внутренностях epf копаюсь.

    Reply ↓
  27. bulpi

    (26)

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

    Reply ↓
  28. demanru

    а в ХранилищеЗначения? Можешь кидать туда всё что угодно и доставать как бинарный файл 😉

    Reply ↓
  29. ll13

    (28) Угу, особенно во внешней обработке …

    Пример в студию !

    Reply ↓
  30. ILM

    Если бы обработки позволяли хранить данные внутри себя. Причем не меняя размер. Много задач можно было бы решить без единого изменения конфигурации. Одними внешними разработками 😉

    Reply ↓
  31. v.l.

    Я вот что думаю — можно ведь этот MXL загнать в виде строки и зашифровать её штатными средствами 1С 8.

    Пример:

     КартинкаВСтроке = «iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAACXBIWXMAAAs6AAAL
    |OgFkf1cNAAAEbElEQVR4nJXTazSbdxzA8ZyzIZnI5Xme0IZEXDvXFE2Kuu2U­sZnV
    |pkq1xzhTXa1no0IQtyCppFPnuAalHIYVzUq0uiXIEMclmYQ8iSKKJy55vxd7­txec
    |XlE75//iOc/3eT4v/v/fH2Uy6k+y1jdV+Z3XI1LBqxHWfS0VxnX1Ox+gPkgg­hgV4
    |cSynMPJcFpZeaHUhDZtXd3l5VfH/IMSw8KRdwOcnedWSSEMgOEkiTEGBYwyB­rnTy
    |5dMNZOFE0O6mVjog+jHGLSYIbSciYqvxhFGAIIMIEogmdUqcja/S8E4EqSYH­78T7
    |pYSS67lpYSzaqVw8tgGPqwdwdURcHQCKbKhtjrBB8QFoc2VeVH4zkYHrbylX­TTxJ
    |T/RM4Pide+hH5dFwJURsOR57j4AV4gfmO46D9hDdn/2NqWG2gsxvt1ZVGyvz­Bd+F
    |lNyOeqCtyZTeim6LCm0KCW0N+bwzXLLQcxxkXFdXs5OuXyCND7aZjPo9BObd­jmEl
    |MrV6uXJNplweVSw9q5MJK6QcOTx0HLSgkBSmhAnvXH65PLcPNXJvJAfbzMvF­Owi8
    |g2hNRv3iiwl4TbH/fCT013CHICtOJm7eQ+B9SPq46adYL+mAaA/RHfrLIdDW­qqq/
    |uayuKBVWSl+9XNMqagtTehuK3p/pIyG9crTsh6iOqmzjyut529lYGuwQ3suO­183J
    |tg2aN9O70N6WDh5//ojDFkRHJtAtWYGe4nzOguTxq9TNzroZSGX5e1YGh3dn­ZO6n
    |9yBEpxQ/El2MLfN2+9naLu6MxfeniSxzuwpnxkgFf7a3qyEspt8zLN/d9pob­Jg0H
    |ZXxMLnXwHeHxjavqt6DlSWklPViezm669M21j0gJAC6BQChA23Mt7AsAl2Ky­Ryvg
    |aYhO5bm6JwL4BACfh6Zy0fYc6MwI/+6+dQB1pWU8DI//d9ukFbU30wMqHNxK­Qdd2
    |oler1ad5aEqOGVlMjzS0/loTFMohudx39BDb+HRYueWhKZVeQfL6+m2DBmUy­6rWj
    |z6r8wyfy+P9olpHkXK17hNo7cooSpITO9wFepRhathm56+KV3YnZmfCkSffP­NM6h
    |SuuDxLaidSWnr0yPoXbWF8fqa8sd/br9ouDYW/pTQTB4XgcFwETmNOjXA3rz­MQ7Z
    |Zqdrnfz/jrkBQ/46KED7RmJhKI0RsUt/SFA764ujNTU8V6YQ6/yU5DsPMhYB­xhLA
    |nAMZQ6BvF+BdhqaxzG2FWKdxwPeQZGHX/NWVFwoZyoToVL/31QR/WYShthHc­JZCv
    |FPR9DvqIQXofdLYJ71ZgTskxt/3F0mkQ8jk0DZdwD/bIuKqW3a8utvOq+ITW­THDv
    |Ael90NlekN5G8OBiaLnmtmwMhYuxPzTxXRha6fDrU9vd1Ipz8kup3sUYqgDr­VIV1
    |Flo6FllQctGUu67Mlq8Tj0ryhvrdjaW3Jnt3UztWV9v4RRzfhZmPtc8xI5eQ­PR5c
    |ujrT3bm9rjkq7W4ecfs3lmbmB36b7myfam1RD4uRZdVJksmo/w8QKxDHSNf5­ZQAA
    |AABJRU5ErkJggg==»;
    КартинкаВДвоичныхДанных = Base64Значение(КартинкаВСтроке);
    Картинки.Вставить(«Бонус1»,Новый Картинка(КартинкаВДвоичныхДанных));
    

    Показать

    Reply ↓
  32. yuraos

    Вопрос знатокам:

    А как бы исшо для пусчей важности «защитить» модули форм???

    Reply ↓

Leave a Comment

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