Шифратор 1С




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

29 Comments

  1. asg

    Браво, маэстро… Ковырял демку больше часа, строковые константы МД.Обработки.РазборГЛ расшифровал но понять остальные переменные и логику программы сложнее, чем написать свой код. Кстати, какое мыло для связи?

    Reply
  2. asg

    (мой ящик tomailme@yandex.ru)

    Reply
  3. imsoftware

    Просто замечательный способ зашифровать свои данные! Огромный респект!! Единственное, чтобы я посоветовал, функцию дешифровки вставлять не в самом начале, а где-нибудь в середине модуля и строковые константы разбивать на бОльшее количество кусков (чтобы и желания не возникало возиться с этим текстом).

    Reply
  4. Молоток!!

    Reply
  5. support

    есть еще шифровка модуля с помощью переименовки всех переменных и функций

    https://infostart.ru/public/13860/

    Reply
  6. mdzen

    «На злобу дня» Дома поковыряю. Особенно как поведет себя на конфе где 1С++ прикручен.

    Reply
  7. vasilykushnir

    Вопросс автору (немного не в тему), не принимал ли он участия в разработке Новейшего Отчета, или его разработчики просто применили твой шифровальщик? Пробовал расковырять: в принципе возможно, но тоскли-и-и-во…

    Reply
  8. support

    Да, шифратор был создан специально для защиты Новейшего отчета.

    Reply
  9. vasilykushnir

    +1

    Тогда усе понятно — то-то смотрю: знакомые крякозяблики. С чистой совестью добавляю рейтинг.

    Reply
  10. vasilykushnir

    И еще вопросс: а обратный ход у шифровальщика есть? Или это уже будет называтся готовый кряк?

    Reply
  11. support

    обратного хода нет, этот процесс шифрования необратим

    Reply
  12. АЛьФ

    Еще как обратим 🙂

    Естественно, не имена переменных, но удобочитаемый текст можно сделать.

    Reply
  13. support

    не знаю насколько он станет удобочитаемый

    Reply
  14. АЛьФ

    Достаточным для разбора алгоритма. Если после этого немного ручками доработать, то станет вообще как новенький.

    Reply
  15. support

    смотря какой алгоритм, и его количество

    Reply
  16. vasilykushnir

    Я, например, убрал для начала все символы новой строки(получилась длинющая строка), затем после каждой точки с запятой опять их вставил, а потом в конфигураторе уже ручками настучал по клаве Энтер и редактор сам подформатировал текст. Что-то более суръезное писать было в лом. Получилось не ахти что, но вполне читаемое.

    Reply
  17. support

    Вообще, сначала надо решить, от чего защищаем. От копирования продукта?

    Так для этого шифратор не предназначен

    От изменения кода? Нет, тоже можно разобраться.

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

    Reply
  18. АЛьФ

    «смотря какой алгоритм, и его количество»

    ИМХО любой.

    Reply
  19. АЛьФ

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

    Вот это ты зря. На ассемблере до сих пор некоторые умельцы даже операционки пишут.

    Reply
  20. васисубатор

    сам то как потом расшифруешь?

    Reply
  21. Abadonna

    (20)>сам то как потом расшифруешь?

    А зачем самому расшифровывать? Конечно, если мозгов нет и исходники не сохранил — тогда чуток повозиться придется

    Reply
  22. OzzY

    Отличная вещь! Обратим — не обратим. Глупости все это. Любая защита подразумевает определенный уровень подготовки взломщика. Есть медвежатники для которых вообще не существует «не ломаемых» сейфов, так что теперь отменим все сейфы нафиг? Пусть кто-нибудь расшифрует не одну ert-шку, а всю конфу, зашифрованную данным продуктом, да еще сделает ее удобочитаемой, а потом посмотрит на часы…..

    Однозначно +1

    Reply
  23. Slesh-01

    +1

    Reply
  24. ev-kov

    с классами 1с++ не работает однако …

    Reply
  25. tonger

    Большое Спасибо!

    Очень полезная обработка

    Reply
  26. PochekutovOleg

    А зачем шифровать

    Можно все сделать стандартами средствами Windows Server

    Reply
  27. Гость

    очень интересная и полезная обработка,спасибо,очень кстати

    Reply
  28. zsder

    Спасибо автору!

    Пригодилась и не раз!!

    Reply
  29. maverick76

    Круто…

    Reply

Leave a Comment

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