Защищаем конфигурацию. Один ключ СЛК для всех клиентов




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

60 Comments

  1. VISkvortsov

    Если у клиента пропал интернет?

    Reply
  2. mvxyz

    (1) Обращение к серверу СЛК и к сервису поддержки выполняется один раз при запуске приложения или при подключении. Результаты подключения кэшируются через модуль с повторным использованием значений. Поэтому, если Интернет у клиента пропал после успешного подключения, защищаемая функциональность будет доступна до перезапуска приложения.

    Reply
  3. SerVer1C

    Сомнительная защита… У клиента будет уже не СЛК. Закрытый модуль с обменами через HTTP можно декомпилировать и посмотреть логику его работы. Ну а далее уже дело техники.

    Reply
  4. mvxyz

    (3) Закрытый модуль не предается по сети. Закрытый модуль хранится в общем макете с типом «Двоичные данные» в зашифрованном виде. Порядок его создания описан в п.8 статьи.

    В данном случае СЛК работает как обычно, однако используется не для контроля количества лицензий, а только для обеспечения возможности вызова функций из закрытого (зашифрованного) модуля. (При «обычном» использовании СЛК мы также можем размещать его в сети).

    Reply
  5. lunjio

    (4) Что мешает отловить вызов http сервиса, когда передается ваш зашифрованный по закрытому ключу текст модуля, чтобы в ответ получить декомпилированный модуль, сохранить его и изменить код, чтобы ваш http сервис не вызывался и сразу передавать декомпилированный модуль.

    Reply
  6. mvxyz

    (5) Текст модуля не передается. Текст закрытого модуля хранится в защищаемой конфигурации в макете. Повторюсь: принцип защиты закрытого модуля ничем не отличается от стандартного использования СЛК.

    Reply
  7. SerVer1C

    (4) Насколько мне известно, принцип работы защиты СЛК на клиенте следующий: зашифрованный модуль (алгоритмом RSA ?) расшифровывается ключом, который берется из USB-токена. Откуда будет браться ключ для расшифровки модулей из вашей поделки? Если вы его спрятали в зашифрованный средствами 1с модуль, то так дело не пойдет. Если ваши функции wСЛКПовтИсп.ЗащищенныйМодульПодключен() и wСЛКПовтИсп.ЛицензияРазработчикаПолучена() находятся тоже в защищенном средствами 1с модуле, то тут их значения можно выставить на постоянку в Истина.

    Reply
  8. mvxyz

    (7) Алгоритм работы СЛК вкратце следующий:

    — подключается компонента СЛК, код которой находится в защищенной конфигурации в общем макете с типом «Двоичные данные»;

    — создается экспортируемый компонентой объект, в свойствах которого указываются параметры связи с сервером СЛК;

    — выполняется запуск объекта с указанием используемой серии ключей. В этот момент объект компоненты устанавливает соединение с сервером СЛК. Что конкретно делает объект компоненты, какой запрос отправляет, каким алгоритмом его шифрует, что СЛК возвращает — знают только разработчики СЛК.

    Если запуск проходит успешно, то есть сервер СЛК запущен, серия ключа совпадает, совпадают (если заданы) доп. параметры, то метод Объект.Запуск() возвращает Истина и создается менеджер объектов.

    Затем при помощи менеджера объектов можно создавать наши защищенные объекты из наших защищенных макетов. К этой поделке я не имею никакого отношения. Это поделка разработчиков СЛК. Хорошая, кстати, поделка.

    Далее, с помощью менеджера объектов СЛК мы создаем из нашего зашифрованного макета наш закрытый модуль и используем его функции для обращения к нашему серверу поддержки. Стоит отметить также, что даже после успешного создания нашего модуля мы в отладке не сможем просмотреть его код. Мы сможем только вызывать его функции.

    Более того, если даже у Вас есть весь комплект разработчика с ключами и Вы вдруг потеряли исходный код своего закрытого модуля, вы не сможете так вот просто взять и восстановить его из защищенного макета, так как редактор файлов СЛК работает в одну сторону.

    Если интересно, могу выслать «Руководство разработчика» СЛК. Там все подробно описано.

    Reply
  9. SerVer1C

    (8) Не совсем понял, клиент будет ходить на ваш сервер СЛК через интернет?

    Reply
  10. mvxyz

    (9) Совершенно верно. Уже год ходят.

    Reply
  11. SerVer1C

    (10) Ну так а что мешает отладкой посмотреть, что вернул ваш сервер СЛК и потом самому подсовывать ответ клиенту? Если эта проверка происходит в закрытом модуле 1с, то это не проблема.

    Reply
  12. mvxyz

    (11) Если для Вас не проблема взломать СЛК, то вы — серьезный специалист. Поделитесь методикой?

    Чтобы посмотреть, что вернул СЛК, надо декомпилировать двоичные данные макета внешней компоненты СЛК.

    Reply
  13. SerVer1C

    (12) Я не про СЛК, в вашем решении есть «последняя миля», когда код, еще не зашифрованный СЛК, идет на ваш сервер за лицензией, вот на этом этапе можно его перехватить.

    Reply
  14. AllexSoft

    (13) тут надо разделить на два сценария: 1 у вас есть оригинальный ключ защиты, и вам надо сделать копию конфигурации которая будет работать с этим же ключем, тогда перехват кода поможет восстановить алгоритм запроса сервера СЛК и все его параметры.

    2. У вас нет оригинального ключа защиты. А вот тут сложнее, ибо модуль с зашифрованными функциями это скорее всего байт-код, сверху зашифрованный СЛК, ну и расшифровывается уже на стороне сервера СЛК соответственно. Без ключа СЛК просто откажется его расшифровывать.

    В принципе от сценария 2 защита неплохая, если реализовывать самому такое поделие — то дешво и сердито в принципе, простенький сервис СЛК на том же ПХП нагородить который будет принимать авторизацию от клиентов и выдвать токен, ну функцию расшифровки модуля. В 1С соответственно функцию вызова сервиса, сборки внешней обработки из возвращенного бинарника. Делов на день-два в принципе.

    Интересно сколько хотят за сие поделие ?

    Reply
  15. SerVer1C

    (14) Так автор же и пишет, что зашифрованный модуль не уходит на сервер, а с сервера приходит информация, можно/нельзя (+ наверное, и ключ для расшифровки?) пользоваться конфой — тут мы и выполняем атаку MITM.

    Reply
  16. AllexSoft

    (15) ну если с сервера приходит голый ключ, это дыра однозначно.

    Если бы я был разрабом подобного сервиса то защищаемые модуля вообще бы не располагал в макетах конфигурации, вообще их в конфигурации не было бы.. можно же было бы расположить его в виде бинарника в стороне СЛК-сервера, все равно к нему доступ только разработчиков есть и все. Запилить веб-морду из которой можно загружать эти бинарники и управлять лицензиями клиентов, видеть статистику, кто заходит, какими конфами, сколько юзеров. Добавлятьудалять лицензии и тд.

    И никакого шифрования не надо тогда, в 1С пулять по запросу уже чистый байт-код, а может даже и куски байт-кода, пусть выполняет.

    А вообще я к таким онлайн-защитам отношусь с недоверием именно из за онлайна, а где уверенность что у каждого клиента вообще есть интернет? Почему бы ему не работать не на автономном ноутбуке где нибудь на удаленном складе? А почему есть уверенность что у клиента настроено резервирование интернета, и в один прекрасный день он не отвалится и работа в 1С окажется невозможной по факту (даже при наличии модулей с повторно-возвращемыми значениями не факт что у вас сбой инета не будет с утра, когда юзеры только заходят в 1С). А что если сервер СЛК не будет доступен? Ведь аптаймы серверов то же не 100%, то есть надо позаботиться о как минимум резервировании в 2х разных дата центах, у двух разных провайдеров. Кароче много но и если… В итоге разрабу могут и счет за простой выставить, если компания окажется большой и с юристами, а их хлебом не корми дай по судиться с кем нибудь.

    Reply
  17. mvxyz

    (13) На наш сервер отправляется HTTP-запрос по протоколу HTTPS. Необходимость HTTPS отмечена в конце статьи в пункте «Отладка и HTTPS». Процедура отправки запроса и получения ответа размещена в закрытом модуле.

    Reply
  18. SerVer1C

    (17) В закрытом модуле с помощью средств 1с ?

    Reply
  19. mvxyz

    (16) Необходимость наличия доступа в Интернет я оговорил в начале статьи. Описанную конструкцию мы используем для защиты функциональности, которая требует доступа в Интернет по определению.

    Согласен, что наш сервер должен работать надежно.За год работы было несколько случаев, когда наш сервер падал и клиенты звонили. Однако сабж используется для функционала, без которого можно несколько часов обойтись, никто не умрет.

    Согласен, что для критической функциональности лучше использовать стандартный СЛК, то есть каждому клиенту выдавать свой рег. номер ключа. Мы так и делаем.

    Что касается разработки своей системы защиты, то нужно подумать, есть ли в этом смысл? Ключ (точнее рег. номер ключа) стоит 374 руб., комплект разработчика — 4800 руб.

    Reply
  20. mvxyz

    (18) Да.

    Reply
  21. AllexSoft

    (20) по умолчанию можете считать ваш модуль не закрытым, ибо средства 1С не позволяют закрывать модули надежно.

    Reply
  22. mvxyz

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

    Естественно, возможность взлома защиты СЛК существует.

    Если потребуется сделать обработку для Нью-Йоркской фондовой биржи, то наверное, стоит подумать о других методах защиты.

    Reply
  23. AllexSoft

    (19) если я лицензирую разработку на количество сеансов, то 1 ключ = 1 сеанс ?

    Reply
  24. SerVer1C

    (22) Я вас поздравляю, ваша защита без защиты. Т. к. реверсер свободно сдекомпилирует закрытый средствами 1с модуль. По поводу СЛК скажу — это хорошая защита, но когда она работает локально, а не как у вас.

    Reply
  25. AllexSoft

    (22) знакома, закрытая обработка по сути то же самое что закрытый модуль (не важно чем вы ее расшифруете и положите на диск, хоть внешней компонентой, хоть онлайн-сервисом), разница только в том что бы перехватить момент ее появления на диске, прочитать бинарно и положить в виде отдельной обработки, дальше декомпилятор и тд ) Пока 1С не научится выполнять подобные обработки из объекта ПотокВПамяти, то есть по сути выполнять произвольные куски байт-кода 1с с помощью той же выполнить(), эти все попытки тщетны.. все равно ваш код целиком окажется в кэше на диске (пусть и в байт-коде) откуда его успешно выгребут.

    Да даже после этого будет существовать возможность перехватить блок памяти переданный в Выполнить(), если это будет отдельно процедура, то хуже, ее быстро разберут на запчасти, если отдельные куски, то лучше, в защищаемой конфе может быть этих кусков огромное множество, что сильно затруднит их дальнейшую сборку в единую систему.

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

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

    Reply
  26. mvxyz

    (24) Модуль закрывается не средствами 1С, а средствами внешней компоненты СЛК. Можно поподробнее: как дешифровать и декомпилировать такой закрытый модуль? И чем, по Вашему мнению, принципиально отличается размещение сервера СЛК локально и в сети.

    Reply
  27. mvxyz

    (25) Вы хотите сказать, что защита с помощью СЛК ненадежна?

    Reply
  28. SerVer1C

    (27) Прежде чем передать управление защищенному коду СЛК, нужно что-то проделать. Вот в этот момент мы оказываемся посередине и ломаем-ломаем-ломаем.

    а вы определитесь:

    >>> (17) В закрытом модуле с помощью средств 1с ?

    >>> (18) Да.

    Затем снова по кругу начинаете объяснять, что всё защищено СЛК…

    Reply
  29. mvxyz

    (29) Отвечая «Да» на вопрос «В закрытом модуле с помощью средств 1С?» я имел в виду, что HTTP-запрос выполняется средствами 1С из закрытого модуля, а не то, что модуль закрывается средствами 1С. Прошу прощения, если я Вас неправильно понял. Если бы вопрос был такой: «В модуле, закрытом с помощью средств 1С?», то и ответ был бы другой.

    Reply
  30. AllexSoft

    (28) надежность относительная всегда, важно четко обозначать от чего поможет СЛК, а от чего нет.. как я и сказал от сисадмина который хочет сделать копию себе «на память» и не разбирается в СЛК, поможет. Поможет и от клиента который думает что сможет не заплатить за конфу поставленную по временной демо-лицензии. Но от специалиста 1С, у которого есть оригинальный ключ и который хочет убрать СЛК на совсем не поможет. Допустим я хочу купить защищаемую конфу, покупаю на 1 юзера, получаю ключ, а юзеров у меня 500.. ломаем конфу, и за стоимость одной лицензии получаем лицензию на 500.

    Думаю не будете отрицать что имея скажем оригинальный ключ от 1 пользователя я получу защищаемый модуль в расшифрованном виде у себя на диске? дальше дело техники его забрать оттуда, декомпилить, положить в конфу в исходнике и отключить СЛК на совсем.

    ПС: речь о вашей СЛК разумеется.

    ПСС: если рассматриваем слк c hardware ключом, ну там дамп памяти ключа+эмулятор (тут могут быть различные сложности конечно). Но те конфы от франчей которые я встречал были написаны настолько безобразно что их

    1. использовать не хотелось, а тем более ломать (зачем?)

    2. при декомпиляции (ради любопытства) выяснялось что там Функция типа

    Функция КлючДоступен()

    Если МенеджерСЛК.ПроверитьКлюч() Тогда

    Возврат истина;

    Иначе

    Возврат ложь;

    КонецЕсли;

    КонецФункции

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

    3. В организациях где я работаю есть бюджет на покупку лицензионного софта, ломать его нет надобности просто, лицензии покупаются в первую очередь ради бумажки для проверяющих органов.

    Reply
  31. kostik_love

    (28)

    Просто нужно внести изменения

    Закрытый модуль средствами 1с- это как красная тряпка- уберите из описания всё что с этим связано и путаницы станет меньше)

    Reply
  32. mvxyz

    (32) В описании нет ни слова о закрытии модуля средствами 1С! Нет даже строки «1С». Наоброт, в п.8 достаточно подробно описано как создать закрытый модуль с помощью редактора файлов СЛК. Ну если только — загрузка созданного с помощью редактора СЛК зашифрованного файла с двоичными данными в макет — это средства 1С. Но это как бы уже несерьезно. Закрытие средствами 1С всплыло в комментариях.

    Reply
  33. SerVer1C

    (30) Давайте определимся: пишите защищенный СЛК, либо защищенный 1С. Итак: я правильно понимаю, что HTTPS запрос делается из модуля, защищенного СЛК ? Пусть так. НО при старте 1С какая-то цепочка алгоритмов находится же либо в открытых модулях, либо в защищенных 1С. Перед расшифровкой первого защищенного СЛК модуля нам же надо как-то получить ключ, верно? Так вот перед первой расшифровкой СЛК где находятся алгоритмы??? В защищенном 1С модуле, так ?

    Reply
  34. kostik_love

    (17)

    Вот тут просто не нужно говорить что модуль закрыт- разницы нет какой он- просто идет запрос и получаем ответ- причем ответ должен быть не просто что доступ есть)

    Reply
  35. mvxyz

    (34) Нет, не так. Как — я ответил в (8).

    Reply
  36. mvxyz

    (31) «я получу защищаемый модуль в расшифрованном виде у себя на диске» — надо полагать, что тоже самое можно проделать и для СЛК с программной лицензией, установленного локально? Мне действительно интересно.

    Reply
  37. AllexSoft

    (37) да, конечно. Нет там никакой магии. Сам 1С:СЛК с программной лицензией не содержит никаких блоков программного кода зашитых в СЛК, то есть код там весь лежит в конфе, удалив ключ из системы программный код останется на месте (более того в незащищенном виде как правило, просто байт-код, который декомпилируется и без комплекта оригинального ключа). Ваш вариант СЛК с шифрованием выглядит более предпочтительным на фоне комплекта СЛК предлагаемого 1С.

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

    Для 1С:СЛК с «железным» ключом ситуация выглядит так (сам ключ представляет из себя специализированный микрокомпьютер на чипе с ПЗУ):

    1. Есть ключ, у которого уникальный серийный номер, внутри 1С умеет сверять ИдВставленногоВПК_Ключа = ИдОжидаемогоКлючаЗашитогоПриРазработкеВКонфу, если они равны, то есть в пк вставлен ключ от этого программного продукта — то работаем, если нет — завершение работы. Имеет метод типа «занять лицензию», которая занимает 1 лицензию на 1 клиентский сеанс. Все это добро прописано просто в общем модуле прям в конфе, разумеется непоставляемом (то есть в байт коде).

    2. Сам ключ имеет небольшой объем ПЗУ, в который можно зашить критичные куски кода, считаем это типа .dll с вашим «ноу-хау» конфигурации. Если ключа нет — физически нет программного кода для исполнения.

    На практике встречается только вариант 1. То ли из за лени разработчиков (каждый ключ надо прошивать данными же если используем п2), то ли особенности работы СЛК от 1С не позволяющие по сути воспользоваться преимуществом п 2.

    Вариант 1 снимается без ключа, банальным декомпилированием общего модуля, вариант 2 — дампом ключа + эмулятор ключа куда засовывается этот дамп.

    Reply
  38. mvxyz

    (38) Большое спасибо за подробный ответ!

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

    Вы с таким поведением не сталкивались? Буду очень благодарен за ответ.

    Reply
  39. AllexSoft

    (39) да легко такое может быть, существует не только клиентский кэш сеансовых данных, но и серверный кэш, в папке C:Program Files (x86)1cv8srvinfo
    eg_1541

    Сервер при старте агента сервера формирует там свой вспомогательный кэш и обновляет его по мере необходимости. Предположим что при обновлении конфы он не обновляет ваш закрытый макет в этом кэше, и продолжает отдавать клиентам старую версию из кэша (во что я лично не сильно верю). Я бы попробовал просто сделать простенькую обработку с кнопочкой и таким кодом (и выполнить ее на базе во время проявления глюка после обновления):

    стрОригинал = «хххххх»;
    стрМакет = Base64Строка(ПолучитьОбщийМакет(«ВашЗащищаемыйМакет»));
    если стрОригинал <> стрМакет  тогда
    Сообщить(«Что то тут не так»);
    конецЕсли;

    где стрОриганал — это строка получаемая в результате стрОригинал = Base64Строка(ПолучитьОбщийМакет(«ВашЗащищаемыйМакет»));

    выполненной на локальной (файловой) обновленной копии, той же версии (то есть это 100% эталон).

    Если не будет совпадать — значит это баг платформы 1с с обновлением серверных кэшей при обновлении.

    если они будут совпадать, тогда у вас проблема именно в распаковке модуля, его дешифровке и тд, одним словом в ваших алгоритмах СЛК (в том самом закрытом модуле). Попробуйте на время теста у модуля «Повторное использование возвращаемых значений» = Не использовать. Увидите, изменится ли что нибудь, вполне возможно дело не в модуле, он то как раз обновляется нормально, а с кэшем этих повторно возвращаемых значений.

    ПС: предполагаю что ваш закрытый макет представляет из себя двоичные данные, если это просто шифрованные текст, то Base64Строка не нужна

    ПСС: предпогаю что обновляете НЕ динамически, то есть выгоняете всех пользователей. Если динамически — то в этом дело )

    Reply
  40. mvxyz

    (40) Большое спасибо!

    Предположения ПС и ПСС верные.

    Модуль с повторным использованием возвращаемых значений вроде не влияет, но надо еще раз перепроверить.

    Я для проверки делаю так: прописываю номер версии конфигурации в двух местах — в открытом и в закрытом модуле. Проверяю и если номера не совпадают, то вывожу сообщение, что надо перезапустить Агент сервера.

    Reply
  41. Rustig

    (0) все равно годный метод. спасибо за статью. остальным спасибо за полемику.

    Reply
  42. mvxyz

    (42) Спасибо за спасибо!

    На самом деле я не вижу причин считать предлагаемую защиту менее надежной, чем надежность самого СЛК.

    Reply
  43. sg12

    Решение интересное, это бесспорно, но нужен интернет у клиента и у разработчика, то что кэш есть это хорошо, но интернета может не быть с утра и до обеда.

    Reply
  44. mvxyz

    (44) Да, это так. См. (19) .

    Reply
  45. ValeriVP

    (28) время на взлом СЛК при наличии доступного ключа — 10мин

    Reply
  46. ValeriVP

    (43) Следует различать защиту кода и лицензирование.

    В данной публикации, как я понял, вы описываете свою систему лицензирования в сочетании с защитой СЛК.

    Ваша идея вроде как не плоха, но в ней много дыр — например:

    несложно реализовать политику лицензирования по количеству одновременных сеансов, количеству устройств, на которых установлена конфигурация и т. п.;

    Вы пробовали считать сеансы? ИМХО там не все так просто.

    можно получать данные о платформе, используемой версии конфигурации и т. д., что очень помогает при расследовании инцидентов;

    Вы получили явное согласие клиента на сбор телеметрии?

    Reply
  47. mvxyz

    (47) 1) Да, защита кода с помощью СЛК + система лицензирования.

    2) Подсчета сеансов в прилагаемом примере нет. Но в рабочей конфигурации реализовал (лицензирование по количеству одновременных сеансов). Разработан также вариант по количеству подключенных устройств, правда в боевом режиме не используем. Решили — по сеансам. И да, с подсчетом сеансов повозился, но в результате получилось не слишком сложно.

    3) Сейчас собираем только технологические данные: номер версии платформы, имя и релиз конфигурации, номер нашего релиза. Планируем сделать сбор логов исключений. Это не персональная и не коммерческая информация. Если есть нормативный акт, запрещающий сбор такой информации, буду благодарен за ссылку.

    Последняя конфигурация, в которой этот механизм реализован, на этой неделе прошла сертификацию на «1С:Совместимо».

    Reply
  48. mvxyz

    (46) Так ведь в данном случае ключа у пользователя нет! Рег. номер ключа СЛК активирован на нашем сервере. Это отметил и AllexSoft в (38).

    Reply
  49. ValeriVP

    (49) не важно где ключ, важно что он доступен. Т.е. если конфигурация работает — то снять защиту — очень просто.

    Reply
  50. ValeriVP

    (48) Подсчет сеансов — вы же фиксируете вход и выход, а так же периодический опрос — для избежания зависания сеансов?

    Reply
  51. mvxyz

    (50) Просто для того, кто умеет. Таких мало. СЛК используется, наверное, во всех (во всяком случае, во многих) защищенных разработках Раруса. И ничего, живут.

    Как справедливо отметил в этот четверг в своем докладе на Infostart Event Андрей Александрович «Внимание хакеров еще надо заслужить».

    Кроме того существует другая сторона вопроса.

    Одна из наших конфигураций (https://infostart.ru/public/539703/) установлена более чем у тысячи клиентов. Там обычный СЛК с программной лицензией, каждому клиенту — свой ключ. Казалось бы нужная конфигурация и цена приличная. Но кто будет ломать защиту? Клиентам нужна поддержка и обновления.

    В другой конфигурации (https://infostart.ru/public/988788/) используется описанная здесь конструкция. Цена лицензии в зависимости от вида 1500-6000 руб. При продвижении мы рассчитывали на партнерскую сеть. Так вот партнерам за эти деньги (за 50%) даже внедрять не очень интересно (внедрение — 30 минут). Не то что кому-то ломать защиту. Кроме того, если и сломают, то опять же останутся без обновлений.

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

    Reply
  52. mvxyz

    (51) Касательно лицензий я, наверное, поторопился с радужным ответом. Есть проблемы.

    В двух словах так:

    В защищаемой конфигурации привязываюсь к некоторому значимому событию, обрабатываемому в закрытом модуле, и получаю количество сеансов:

     Функция КоличествоСеансов()
    
    КоличествоСеансов = 0;
    
    СеансыИнформационнойБазы = ПолучитьСеансыИнформационнойБазы();
    
    Для Каждого СеансИБ Из СеансыИнформационнойБазы Цикл
    ИмяПриложения = СеансИБ.ИмяПриложения;
    Если ИмяПриложения = «MobileClient»
    ИЛИ ИмяПриложения = «1CV8C»
    ИЛИ ИмяПриложения = «WebClient»
    Тогда
    
    КоличествоСеансов = КоличествоСеансов + 1;
    
    КонецЕсли;
    
    КонецЦикла;
    
    Возврат КоличествоСеансов;
    
    КонецФункции
    

    Показать

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

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

    Reply
  53. ValeriVP

    (52)

    СЛК используется, наверное, во всех (во всяком случае, во многих) защищенных разработках Раруса. И ничего, живут.

    Вам наверняка знакомо понятие «Систематическая ошибка выжившего» — т.е. статистики по не лицензионному использованию этих конфигураций у вас нет.

    Вместе с тем, для конфигураций стоимостью менее 10т.р. на организацию никто не будет привлекать специалиста по взлому.

    Однако для конфигураций стоимостью 5т.р. на рабочее место — вероятность попыток взлома я оцениваю в 100% (т.е. найдутся пользователи желающие снизить стоимость владения).

    Обновления — в случае отучения конфигурации от ключа нет проблемы повторить 10ти минутную процедуру для обновленной конфигурации.

    Reply
  54. ValeriVP

    (53) допустимое решение, но имеет особенность — вы считаете пользователей в одной базе.

    т.е. два клиента с одним ключом могут спокойно работать.

    Reply
  55. mvxyz

    (54) Согласен. Статистики по нелицензионному использованию нет. Мои соображения умозрительные. Однако в данном случае можно получить хоть какие-то данные для анализа. Например, сравнить количество обращений к бэку от данного клиента с количеством выданных ему лицензий. Или зафиксировать отсутствие обращений.

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

    Во втором случае сложнее. Решение работает хорошо. Поддержка там не сильно нужна. Вероятность взлома есть.

    Reply
  56. mvxyz

    (55) Это так. Но тут имеет место особенность нашего решения: Центральная база (УТ10) обменивается с конфигурацией-шлюзом, а к шлюзу подключаются мобильные клиенты. То есть база как бы одна.

    Reply
  57. ValeriVP

    (56) Наблюдается противоречие — зачем защищать, если вы не опасаетесь не лицензионного использования?

    Reply
  58. ValeriVP

    (57) т.к. вы положили свое решение на Инфостарт, я рассматриваю ваше как универсальное.

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

    Reply
  59. mvxyz

    (58) Противоречие кажущееся. Я не сильно опасаюсь взлома (пока, на текущем этапе), но, как Вы справедливо указали в (47), есть еще система лицензирования. Делать ее без связки с защитой как-то несерьезно. Скажем так: нужно лицензировать честных (в смысле тех, кто не взламывает) клиентов.

    Reply
  60. rjkjlptq

    (31)Здравствуйте.

    Функцию КлючДоступен() скорректировали.

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

    Reply

Leave a Comment

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