Ещё пара слов о защите разработок..




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

51 Comments

  1. Vitek

    Видел в одной конфе, «жизнено важный код» переносят во внешние обработки, которые просто напросто засовывают в ВК.

    Reply
  2. German

    Модуль любой открытой(созданной) обработки находится в $UserTempv8_*.tmp.

    Так что все эти фантазии бред. Только ВК… другого выхода нет..

    Reply
  3. Дуб

    (2) допустим. Применительно к v8 убедил (почти).

    Но ВК — это права админа для регистрации. Которых может и не быть..

    Reply
  4. Дуб

    (2) кстати, я говорил о защите от прямого вскрытия.

    Более толковые аргументы есть?

    С поправкой на саму статью (если её прочесть).

    Reply
  5. support

    Хорошая статья, наглядно отражает ошибочное мнение про защиту, зачем минусовать? Можно в ответ написать подробное объяснение.

    Reply
  6. Дуб

    (5) так словами мнения-то говорить кто-нить будет? С аргументами.

    Reply
  7. coder1cv8

    Для простого отчета/обработки достаточно таких методов как:

    1. обфускация исходного кода

    2. обфускация байт-кода

    3. шифрование кода

    4. штатный пароль/поставка без исходного кода

    Этого более чем достаточно, что бы «ломать» отчет стало НЕ ВЫГОДНО.

    Если же вы продаете большие (дорогие) решения, то имеют смысл и затраты на защиту нормальную (вынос в длл-ки, ключи, от Интелис тут решение мелькало и т.д.)

    ЗЫ: А вообще ПРЕДОПЛАТА рулит! 🙂

    Reply
  8. coder1cv8

    (2) Зачем минусовать? Мне лично, интересно было почитать мнение автора, хоть и несколько наивное 🙂

    Reply
  9. Дуб

    (7) это — бесспорные утверждения. Которые, кстати, я в статье не отбрасывал. Обфускацию, правда, не упомянул. Предоплату — не обсуждал в силу предмета статьи.

    И про большие решения речь не шла.

    Повторюсь — речь шла о дополнительном «туннеле». И о том, что можно обработку изначально давать урезанную. Т.е. клиент, отказываясь от оплаты, узнаёт об истечении срока пост-фактум. И при выцеплении кода из кэша получает уже урезанную версию.

    Reply
  10. Дуб

    (8) говорю-же: ночные бдения :).. А опята киданий (и попыток киданий) у меня хватает..

    Reply
  11. German

    (3) если обработку взять из Temp её еще и проще декомпилировать .. так как она уже распакована..

    Насчёт прав админа, это единственная сложность в ВК.

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

    Reply
  12. RobberHood

    Усё хорошо. Если видишь,что клиент — гомик, и денег у него повсей видимости нет,тогда незачем с ним связываться.

    А если связался,то не ограничивайся защитой только данного отчета или конфигурации.Твой ответ должен быть ,как ответ России Грузии:

    Нанести максимальный ущерб !!! Удалить не только свой отчет ,но и большую(доступную) часть программ на Сервере и в Локалке.

    Reply
  13. Vitek

    (12)

    «Если видишь,что клиент — гомик,и денег у него повсей видимости нет»

    Ты ясновидец? К тому же иногда не платят те у кого эти самые деньги есть, просто жаба душит.

    >Нанести максимальный ущерб !!! Удалить не только свой отчет ,но и большую(доступную) часть программ на Сервере и в Локалке.

    А это уже вредительство, и под уголовное законодательство попадает кажется.

    Reply
  14. Дуб

    (11) «потратят время» на что?

    И чего информативного ты хотел?

    Я порассуждал вслух, предложил вариант. А ты цедишь сквозь зубы обрывками комментарии (кстати, толковые комментарии), перекладывая их кучами пустых слов.

    Коль скоро ты решил отреагировать — так реагируй адекватно, по делу.

    И потом — «первые шаги» — это что такое? У меня в своё время всё выливалось в очередную закупку КЗК (в чём не вижу ничего плохого, кстати). И почему не рассмотреть все возможные пути действий, их плюсы и минусы?

    (12) будем считать это шуткой..

    Reply
  15. German

    (14) Сделай сам.

    Вот уважаемый вам рецепт для защиты конфы в серверном варианте.

    Берете снифер врубаете его по порту сервера. (1542).

    И смотрите какие данные там идут… при открытии документа. :000

    Кодируем ключом (2048) записи(модуля) в таблице Config, cоответственно в конфигураторе уже ее не откроешь.

    Сервер будут отдавать эти упакованные записи клиенту. Клиент при попытке их распаковать будет вываливаться с ошибкой «Ошибка формата потока». Поэтому пред клиентом ставим распаковщик на основе WinPcap http://www.winpcap.org/default.htm. которому и передаем ключ. Распакованные модуль передается непосредственно клиенту. Клиент получает уже привычный для него набор данных. И кеширует его в $UserTemp наше дело это оперативно убрать. …..

    Сразу предупреждаю вопросы от том что …..» и для внешней обработки модуль из $UserTemp тоже можно убрать!!!» попробуйте не получится. И потом подумайте почему.

    Описанная технология будет работать с такой же скоростью что и обычная .. модуль любого открытого объекта кешируется клиентом.

    Удачи…

    Reply
  16. Дуб

    (15) а теперь — как это исполнить? Т.е. технически как это реализуемо? Допустим (частый случай), клиент использует комбинированный доступ: терминально и по сети. При этом у меня, как у стороннего разработчика, нет прав ни устанавливать ПО, ни перенастраивать действующее ПО.

    Мои действия?

    И, пожалуйста, не надо «выкать». У меня комплекс неполноценности от этого разыгрывается 😉

    Reply
  17. German

    (16) да никак … ты 🙂 такое ощущение все пытаешься мне палки в колеса вставить.

    Reply
  18. Дуб

    (17) вовсе нет. Я и тему-то поднял ввиду ограниченности прав в большинстве случаев. Понятно, что проще всего — ВК пользовать. Дёшево и сердито. И статей полно по разработке.

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

    То, что идея не понравилась — я понял.

    Теперь хочу конструктива.

    Не к тому, что я — д’Артаньян, а остальные — козлы. Просто, может есть простые и очевидные способы, которых я не вижу.

    Reply
  19. coder1cv8

    (18) Все простые и очевидные способы я перечислил. Зачем ещё что-то изобретать? Какого конструктива ещё не хватает?… 🙂

    Reply
  20. Дуб

    (19) для особо одарённых — уточни:

    1. обфускация исходного кода — это понятно

    2. обфускация байт-кода — это что за зверь? В 1С язык интерпретируемый. Какой байт-код?

    3. шифрование кода — какими средствами? Снова ВК?

    4. штатный пароль/поставка без исходного кода — это опять понятно..

    По п.3 — однозначно согласен. По п.1 — любой студент тупо вручную сможет справиться с восстановлением кода. Вопрос времени, а так — работа тупая. По п.4 уже говорил, что при мне такие вещи вскрывались людьми, не имеющими представления о защите/взломе. Просто за якобы-красивые глаза..

    Reply
  21. coder1cv8

    (20)

    1. восстановить код-то можно… Но ты будешь разбираться в алгоритме где все переменные/процедуры названы перем1/проц1? Я — НЕТ. 🙂

    2. «байт-код» — это скомпилированная обработка, как я себе представляю. Т.е. то что получается если ты устанавливаешь пароль или говоришь поставлять без исходного кода. Его тоже можно обфусцировать, таким образом ни один декомпилятор, ни за какие красивые глазки его на автомате не вытащит. Впрочем, в этом вопросе есть здесь более сведущие люди 🙂

    3. Можно с ВК, можно без. Это дело вкуса.

    4. см. п. 2.

    Reply
  22. Дуб

    (21) т.е. п.2 и п.4 — одно и то же? Понятно. Сужаем круг 🙂

    Просто бороться с обфускацией может тупой студент, время которого стоит копейки. Допускаю ситуацию, когда будет выгоднее взять на месяц (типа «испытательный срок») студента с условием «разобраться с задачей». И он разберётся.

    А вот по поводу «Можно с ВК, можно без» — здесь поподробнее, пожалуйста.

    Кстати, поставка без исходного кода с v7 как сообщается? Это-ж вроде только для v8?

    Reply
  23. coder1cv8

    (22)

    Если я, к примеру, закрою обработку с использованием всех 4-х приведенных методов, то ни один студент её НЕ взломает ни за месяц, ни за год (судя по тому какие нынче студенты пошли :)).

    А что подробнее? Я тут в одной своей статье приводил пример, как можно ключевые моменты, типа проверки срока использования демоверсии, написать на VBScript Encoded.

    Я говорю тока про v8, семерки я в глаза не видел…

    Reply
  24. Дуб

    (23) статью , кстати, помню. Забыл только, что она твоя 🙂

    Кроме того, v7 не имеет механизмов, присутствующих в v8, так что вариант — не универсальный.

    С другой стороны — универсальность, наверное, и не нужна.. Нужна функциональность.

    Всё-таки повторюсь ещё раз: то, что описал я, подразумевает, что обработка не содержит заблокированных участков. Она в принципе является урезанной. Там и разбираться-то не с чем будет..

    Впрочем, проехали. По ходу — не догоняете.

    Reply
  25. vovan519

    Была статья «v7: «Живые» пользователи…(монитор без ВК, нужен ворд)» на мисте или на T1С. Кто помнит, в интересном месте там оказался код…

    К вопросу о защите небольших отчетов можно добавить.

    п.5. Размещение части кода в нестандартных местах обработки.

    Reply
  26. Дуб

    (25) в таблицах, что-ли?

    Reply
  27. fAngel

    видел классный пример с применением 1CPP шифрования и применения дополнительного глобального модуля,

    но такой вариант не подойдет нужна 1СPP, как варианты для обычных модулей можно в StreamEditor.exe рас форматировать текст модуля и например двинуть все в право 🙂 сам видел как некоторые спецы дивились что в обработки нет кода в модуле 🙂

    Reply
  28. vip

    > видел классный пример с применением 1CPP шифрования

    Чего? Какого шифрования?

    Reply
  29. Да, неплохо. В восьмерке можно обработку генерить на лету, из двоичных данных.

    Соответственно, двоичные данные зашифровать.

    МОжно обойтись и без EXE-файла. 😉

    Reply
  30. Дуб

    (29) так ведь опять-таки — я же не о конкретной реализации, а об идеологии… Конечно можно. Тут ведь вся фишка в том, чтобы полнофункциональную обработку вообще не предоставлять (точнее — предоставлять только на период тестовой эксплуатации).

    Reply
  31. Ветер в поле

    Зачем изобретать велосипед?

    Тратить кучу времени на защиту чего-то, что стоит сравнимых денег со стоимостью КЗК-2…

    Сложно потратить один раз 3750 р. и заниматься потом зарабатыванием денег. Частенько проще зарабатывать больше, чем экономить.

    Reply
  32. alexqc

    Фактически — то что должно быть исполнено, должно быть по-любому прочитано :). То есть, неважно, КАК будет зашифрован код, в конце-концов где-то он появится в явном виде. Отсюда мораль: у клиента не должно быть доступа до реального исходника ВООБЩЕ. То есть рулят только обфускаторы и бинарники (байт-код либо ВК с нужным функционалом). У 8ки, насколько мне известно, обработки могут поставляться без исходников, с только байт-кодом. У 77 то же самое делает КЗК-2. А то что для внешних компонент нужны админские права — это заблуждение.

    Reply
  33. alexqc

    (28) У 1С++ есть класс DynaCrypt, с методами ЗашифроватьСтроку и РасшифроватьСтроку. Возможно это и имелось ввиду.

    Reply
  34. Дуб

    (31) экономия, вообще-то, здесь ни при чём. Зачем тогда вообще что-то кодить? Лучше искать уже готовое и пригибать к своим задачам. Только всегда ли это правильно?

    (32) ответь, как зарегистрировать ВК, не имея прав админа? Простой вопрос, надеюсь получить простой ответ 😉

    Reply
  35. JohnyDeath

    (34) ответь, как зарегистрировать ВК, не имея прав админа? Простой вопрос, надеюсь получить простой ответ 😉

    ответ в профиле у кого ты спрашиваешь.

    Reply
  36. alexqc

    JohnyDeath, спасибо за поддержку 🙂

    Дуб, см. http://infostart.ru/projects/559, и тамже мой комментарий под №8.

    Reply
  37. Дуб

    (35),(36) Принято. Убедили. Почти. Вот теперь бы то же самое — под *.NET бы…

    Reply
  38. alexqc

    Первый же вопрос: А НЕТ-то нафига?

    А вообще, я конечно ВК под НЕТ не писал, но предполагаю, что их метод регистрации точно такой же — ведь 1Ска ничего про НЕТ не знает, т.е. запуск идет через обычный ком и загрузчик в «неуправляемой» (неНЕТовской) части компоненты. Если же имеется в виду, что для установки НЕТа админские права нужны — ну так это уже задача другого плана: вы ж не будете, например, с ВК весь дистрибутив НЕТ распространять? И установка НЕТа все-таки не обычное действие, это аналог например установки драйвера — вас же не удивляет что драйвера под админом ставятся?

    Reply
  39. Дуб

    (38) Предположение неверное. Framework является частью Windows и не требует отдельной установки (точнее — устанавливается автоматически при очередном обновлении, хотя, конечно, его, как и прочие пакеты обновления, можно отдельно скачать и отдельно установить).

    А по «первому же» вопросу — продолжив ряд «нафига» — упрёмся в Ассемблер.

    C#, например, очень удобный, приятный в работе язык. Писать на нём — одно удовольствие.

    Reply
  40. ValeriVP

    (16) Как исполнить — используется ВК, для ее регистрации не надо прав при использовании RegsrvEx.

    далее — как сделать с минимальными трудозатратами ВК? Взять готовую.

    (31) Проблема в том, что решение за 3750 ломается студентом (или не студентом?) за 5мин.

    (39) а мне язык D по описанию нравится. правда еще не пробовал

    Reply
  41. АЛьФ

    2(40) Здорово! Давай я тебе зашлю защищенную обработку, а ты мне через 30 минут (в шесть раз больше времени тебе даю, чем ты тут высказал) ее обратно в открытом виде?

    Reply
  42. АЛьФ

    +(41) Ну, так как? Отвечать за свои слова будем?

    Reply
  43. MMF

    идеи, конечно, детские. Окромя запутывания кода (толи обфускатором, толи просто идиотской индивидуальной манерой написания {тут мы вспомним Пита и ему икнется}) в деле защиты кода для 8-ки ничего не взлетит, имхо

    Reply
  44. ValeriVP

    (41) я про Катран, для снятия защиты еще нужен ключ. если ты про что другое — давай посмотрим

    Reply
  45. coder1cv8

    (44) Ха-ха. Лихо съехал! )))

    Reply
  46. АЛьФ

    2(44) Круто! Человек в (31) говорит о КЗК, а ты, отвечая ему, оказывается, о Катране говоришь. Вот ведь… Чудесная логика…

    Reply
  47. ValeriVP

    (45) да нет, я привык отвечать за свои слова, просто надо быть уверенным, что говорим об одном и том же.

    Reply
  48. ValeriVP

    (46) — «чего-то, что стоит сравнимых денег со стоимостью КЗК-2», КЗК-2 как я вижу стоит 5000р, а Катран мы покупали примерно за 4000 ~3750

    и речь идет про 8.x

    Reply
  49. АЛьФ

    2(48) Да ладно, съехал уже.

    Reply
  50. Дуб

    (43) вот, блин.. Я им про методику — они мне про платформу.

    (46) Что-то мне кацца, что сейчас ещё и не такие ходы конём пойдут 😉

    Reply
  51. Gasdrubal

    а как насчет обычного шифрования текстов модулей при помощи RSA? кажется в 1СПП было что — то похожее, по крайней мере один мой знакомый хвастался.

    также хорошая идя — скомпилированные модули, как говорилось выше.

    кстати, есть виды длл без регистрации

    Reply

Leave a Comment

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