<?php // Полная загрузка сервисных книжек, создан 2025-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='\
Спасибо, что называете вещи своими именами: «собственный программный продукт и решили его продать», а не самописки, нетленки и т.д. Очень жаль, что в сообществе 1С, почти на всё, что пишется не в офисе 1С, сразу вешается подобный ярлык…(хотя порой и заслуженно).
Касательно методов защиты, всё-таки лучше инвестировать время в разработку внешней компоненты на с++, и вызывать её из обфусцированных после компиляции модулей 1С (т.е. не только скомпилированных, но и переколбашенных после этого).
Делать компоненту на management-языке типа c#, я не рекомендую, взломается легко, даже если обфусцировать (есть печальный опыт).
(1)
Спасибо за инфу и за отзыв. Как раз думал о внешних dll. Слова самописка и нетленка мне тоже не особо нравятся, хочется побольше уважения к созданным конфигурациям, ведь это реально нелегкий труд.
Спасибо, тема интересная и актуальная. Способ 7 понравился.
А вот по остальному есть проблемы. Да, мы можем хранить кол-во запусков в виде хэша, но алгоритм получения этого хеша также присутствует в составе конфигурации. А дальше никто не мешает сгенерировать себе нужное значение.
От себя могу предложить иной способ, просто урезать демо по функционалу или сделать данные неохраняемыми. Например, реквизиты объекта превращаем в реквизиты формы. Упрощаем отчеты, убираем или упрощаем обработки. Убираем проводки, вместе с регистрами.
В общем и целом — оставляем от конфигурации необходимый минимум, который позволит познакомиться с ее основными функциями, но не позволит полноценно работать в ней.
(3)
Андрей большое Вам Спасибо за комментарий. Мне важно мнение программистов в целом к этой статье. Эту статью без файлов для скачивания написал впервые, она носит чисто информационный характер. Я как и многие учился исключительно сам, а здесь на Инфостарте благодаря отзывам узнаешь много нового, главное это самое новое можно применить. В общем Ваша точка зрения, опыт и замечания надеюсь помогут и мне. Ещё раз благодарю!
Насчет проверки даты на ум сразу приходят две вещи:
1) проверки даты в обработчиках ожидания форм;
2) повреждение конфигурации запущенной демо-базы в случае несовпадения дат (по крайней мере осложнит взлом путем отладки).
Нормально. Мне понравилось. Подойдет как защита от дурака. Постоянно сталкиваюсь с ситуацией, когда аудиторы или другие черти-проверяющие-консультирующие уносят конфигурации (в большинстве своем самоделки или сильно допиленные типовые) потом ставят как свое. Для профессиональных целей, имхо, лучше через внешнюю компоненту с физическим usb ключом.
(1) согласен, managed dll, декомплятся прям как закрытые модули 1с, очень легко, тем же дот пиком. Но и тупо обращение к длл, хоть на c ++ тоже не сильно снижает вероятность взлома, если честно, хотя и декомпиляция уже гораздо сложнее даётся.
Есть вариант это вынос логики в компоненту, с платформой спокойно можно общаться через AppDispatch, но у этого способа другие минусы)
(7) так в этом и суть, не просто в компоненте писать проверку текущей даты и ветку реестра, а размещать там часть бизнес-логики (я не говорю, что это легко). В native обмен делать через json. Взломать в этом случае уже сложнее. Да, положим отвязать от ключа или вырезать код проверки и получится, а получить исходной код — будет существенно сложней (эта часть взлома очень неприятна).
(8) только вот если лицензионному потребителю нужно будет модернизировать этот функционал…ему не очень понравится, что он скрыт в DLLке)
Вспомнил один ооочень хорошой способ, реализовать компоненту, но логика будет во внешней обработке, а обработка будет только подключать внешнюю обработку через ВнешниеОбработки.Подключить(), в пути можно указать путь ко временному хранилищу, а закинуть обработку в теории можно в DLL через тот же AppDistpatch, Потом такую обработку ни как не сохранить и код просмотреть не будет представляться возможности.
Собственно это я увидел разбирая недавно случай, в конфигурации CRM 3.0 от Раруса которая, у нас был косяк с защитой (они ее обновили не давно), новая защита там работает как раз через ВнешниеОбработки.Подключить, из внешней компоненты получается только двоичные данные обработки, которая отвественна за проверку лицензии, потом они помещаются во временное хранилище и потом уже подключается все это дело, так вот, можно подумать, что защита то ломатеся очень просто, достаточно сохранить эти двоичные данные и посмотреть код обработки, но фича в том, что при поптыке сохраните эти ДД вылетает «ошибка формата потока», видимо есть какой то хак от 1С, которые вешает защиту от сохранения ДД. НО! Мы нашли способ сохранить эти ДД, но это не на публику 🙂
(6) Это тоже проблема и, к сожалению, я не знаю как ее решить малой кровью, не прикручивая «взрослых» систем защиты. Если у человека есть доступ к рабочей базе, то никто не помешает ему слить оттуда конфигурацию. Проверяющим, конечно, можно порезать права, но в общем и целом вопрос актуален.
Проблема (и достоинство) 1С в том, что на уровне конфигурации это открытая система, а следовательно любая защита реализованная в самом коде по сути таковой не является. При желании всегда можно разобраться как она работает.
Ничто из предложенного не защитит вашу демо конфигурацию. Любой одинэсник отладкой порешит все ваши обходы. Обфускация исходного кода внесет только больше запутанности. Написанные методы в 1 строку декомпилятор пережует очень легко, т. к. п-код (байт-код эски) не изменится от подобных действий. Поможет только внешняя компонента с обфускацией п-кода или специализированные инструменты защиты, типа СЛК.
Не совсем согласен с п 2. — часто после просмотра демо и внесения в неё каких-либо данных клиент хочет обновить её на нормальную. С измененными метаданными могут быть проблемы. Обычно обрезают функционал.
Встречал случай, когда не выдавалось сообщение об окончании срока действия, но при этом после окончания демо-периода менялся выполняемый код. И ошибки не выдаются чтобы искать где отключается защита и результат не понятный чтобы сесть и разобраться где код работает не правильно.
Чтобы не воровали демки, единственный оптимальный способ — делать их действительно демо. С кодом демо-продукта. Чтобы не было смысла. Но тогда украдут и распространят после покупки и всего делов. Сначала ворованная будет стоить денег, чтобы отбить стоимость или бесплатной, из спортивного интереса. Обратите внимание на мировой опыт защиты по. Все взламывают. Нужно давать преимущества лицензии кроме полного функционала, чтобы был нужда именно купить. Поддержка, эксклюзивные материалы, эксклюзивный сервис. И можно тогда уже цену не заламывать, как это сейчас происходит. Не покупают не только потому что мудаки, а ещё и потому что порой очень дорого. А ещё внедрение и поддержка. Совокупная стоимость владения может оказаться неподъёмной.
Дежавю. Помню, году в 98 читал в Компьютерре статьи Каталова о том, как защищать шароварки. Вот примерно те же самые рекомендации 🙂
Хорошая статья и интересные варианты защиты.
Я использую другой вариант — размещаю демо-версию в облаке. Клиент посмотрел, поигрался — меняю пароль и все.
(16)
Спасибо за комментарий. Думаю Вы правы, в облаке или на стороннем сервере по удаленке без доступа к конфигуратору — самое безопасное размещение демо версии. Так же видел решения, когда часть функционала «переезджает» в облако и демо база работать может только с включенным интернетом. Эти варианты не догадался включить в статью.
поддержка, вот что есть кусок с маслом
продать несколько раз — это брюлики продавать надо
а поддержку прокормит тираж
кто-нибудь помнит Соболя?
1С взлетел как минимум вполовину благодаря ему
сначала люди за тарелку супа «хакеру» ставили ломаную
а потом — па-бам! — надо обновлять
а «хакер» давно уже забил на ваши тарелки
> Дата окончания и количество запусков
Можно же http сервис поднять и к нему обращаться с вопросом, сколько там еще осталось.
Да и с приходом клиент-серверной архитектуры действительно гораздо проще пускать клиента играться на демобазе с тонкого клиента или через браузер, VPN опционален.
Все рекомендации напомнили «Вредные советы» Г. Остера.
Встречал вариант защиты, когда формы помещали в обработку, а эту обработку помещали в макет в виде двоичных данных.
Обфускации, запутывание кода… ничего хорошего не приносят, только производительность падает.
Защищай не защищай программный продукт, а обходной путь найдут все равно и выкинут все лишнее связанное с проверкой лицензионности из конфы и будет без нее все работать прекрасно.
Ога, нажал, только рука немного дернулась 🙂
Каждый год наблюдаю волну обсуждений различных способов защиты.
Когда-то сама сильно увлеклась этой темой.
Сейчас пришла к мнению, что для частных разработчиков все эти извращения с защитой не имеют смысла.
Можно и имена поменять в демке и заморочиться с проверкой времени по внешнему серверу и длл-ками. Но все эти телодвижения очень сильно потом мешают самому и замедляют доработку продукта.
Гораздо полезнее вложить это же время в доработку функционала и постоянное развитие продукта.
Когда вникнешь в эту тему, то понимаешь, насколько просто открыть исходники. Но для большинства это темный лес и заморачиваться с ним никто не будет. Если Ваша разработка стоит не сотню тысяч (а я таких почти не знаю), то вникать в тему декомпиляции слишком дорого в плане времени.
Для 95% процентов 1С-программистов достаточной защитой является поставка без исходного кода.
1% сломает любую защиту, в том числе и длл.
Морочиться ради оставшихся 4% не вижу смысла.
Тут еще есть психологический нюанс. Если человек готов ломать защиту, то он изначально не готов купить. Даже если закрыть так, что он не взломает, то он все равно не купит, а найдет аналог или напишет сам. Фактически никакой пользы (денег от продаж) защита от него все равно не принисёт.
А вот для нормальных покупателей закрытость в ДЛЛ это большое неудобство, которое может оттолкнуть от покупки.
Для себя пришла к выводу, что более чем достаточно «поставка без исходного кода»+»обфускация байткода». Большинство 1С-программистов этого не откроют. И добавить такую защиту можно автоматизировано без лишней мороки. Более сложные варианты это потеря времени разработчика.
(21) а эта обработка ещё дополнительно была запароленной и обфусцирована
(24) Зависит от рынка, на которым вы работаете и опыта. Стоимость разработки 100k+ это всего лишь зарплата двух хороших программистов, года на два разработки, и это не считая продвижения, консультантов и прочего. Если есть что защищать – нужно защищать. Ходить потом по судам, даже если вы запатентуете решение – ничего не даст (нам не дало). Есть опыт, когда создавались компании на основе украденных решений с последующим оттоком клиентов. И хочется потом порассуждать о том, что надо хорошо обслуживать, в этом фишка, или открытый исходный код – это модно и т.д. Но всё это в случае, когда на рынке за вас уже всё написали 1С, или ровно до того момента, пока из своего кармана не выложишь за решение стоимость квартиры в большом городе.
(21) Так часто на семерьке ныкали код, помню было такое. Типа файлы 1c*.* меняли букву c латинскую на c русскую. На восьмерьке давно не видел двоичный код, спрятанный в макеты.
(24) Интересно, а если вы работаете в команде программистов, и кто-то или группа программистов откололась от основной команды — тогда че? Без сомнения, эти некто откроют новую контору или вольются в другую, и уже скоро на рынке появится ваш брат-близнец-конфигурация с аналогичными предложениями поддержки и прочее, но с более низкой стартовой ценой и тут ваш вариант не прокатит. Речь как раз о том и идет как надежно защитить свой труд или труд своей компании и тут лучше «заморочиться» на этапе проектирования, чем потом с изумлением смотреть как твоя же конфигурация выигрывает тендеры.
+ за картинку! =)
(26) В данном случае защита вопрос не технического характера.
Защита технического характера это от нелицензионного использования отдльными клиентами.
Защита от продажи левым разработчиком вашего же продукта другим клиентам это юридическая защита.
обфускация кода? Да легко, если вы пишете код на английском, а переменные называете «spravachnikPolzavatili» «noviyWtrihkod» итд.. в таком случае тот кто его декомпилирует из закрытого доступа — пожалеет 10 раз. Сталкивался с таким, правда не закрытый код. В итоге пришлось половину переписать..
+1, комментарии не менее интересней статьи
(30) Речь не взломанных коробках и их нелегальной продаже, это меньшее зло. Большее, это когда достаются ваши исходные коды, полученные взломом и/или декомпиляцией. Потом, в суде доказывать что-либо будет сложно (если у вас другой практический опыт – поделитесь).
И в случае с технологическими особенностями платформы, защитить исходный код и не потерять привлекательность решения – сложная задача. Но если в решение вкладываются деньги, оно не пишется на энтузиазме, и не является центром модели продаж высокопрофессиональных и узконаправленных услуг, и это не побочный продукт жизнедеятельности компании, то вопрос с защитой встанет ребром.
Только есть использовать DLL в конфигурации, ей не присвоят 1с совместимо. Вроде так, если не путаю ничего.
(13)Как вариант web клиент)
(29) Тоже поставил, потому как люблю издавна картинки Андрея Кузнецова (проект «Чебурген», да и мультики!) Однако на данную статью более всего намекает картинка про чукчу, который (только что вырубил себе сайт изо льда ) — «Хехе! Чохча сам пылгэ!…», а сбоку тихо плачет вполне узнаваемый (исключая то, что одет в кухлянку) известный веб-дизайнер….
По вопросу защиты я присоединяюсь к ekaruk.
(9)
Способ сохранения защищённой обработки озвучивался на ИС и неоднократно — дамп памяти работающего приложения и сохранение участков начинающихся с сигнатуры файла внешней обработки. Никакого секрета в этом давно нет.
Автору спасибо за статью, почитал с интересном (т.к. вопрос очень актуальный для меня), но большинство советов ничего не даст (из опыта).
(24) Правильно написали, кто настроен на взлом — тот взломает. Или просто найдет другое решение. По методам защиты от себя могу добавить еще одно решение — замена печатных форм на образцы. К примеру, есть документ Реализация, в нем формируется печатная форма ТОРГ 12. В демо макет ТОРГ 12 заменяется на готовую (сформированную форму) и вместо большой процедуры формирования формы пишется пару строк вызова макета-примера. Если конфигурация предназначается во основном для формирования документов (печатных форм) — это неплохой способ защиты, особенно если конфига стоит 10-20 тысяч. Переписывать процедуры заново будет дороже.
Пункт 5б часто используется в типовых.
Если в продаваемых решениях(не демо) такой изврат, то сжигать на костре таких 1Снеков надо.
И да, через веб клиент наиболее оптимально демку показывать.
(42)По поводу продаваемых решений полностью с Вами согласен. Вообще хочется всегда писать код чисто, красиво и чтобы было легко понять что из чего следует. Жаль, что нельзя защитить такой красивый код штатными средствами от 1С.