Танцы с бубном! Создаём демонстрационную базу




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

40 Comments

  1. grumagargler

    Спасибо, что называете вещи своими именами: «собственный программный продукт и решили его продать», а не самописки, нетленки и т.д. Очень жаль, что в сообществе 1С, почти на всё, что пишется не в офисе 1С, сразу вешается подобный ярлык…(хотя порой и заслуженно).

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

    Делать компоненту на management-языке типа c#, я не рекомендую, взломается легко, даже если обфусцировать (есть печальный опыт).

    Reply
  2. user748289

    (1)

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

    Reply
  3. oldcopy

    Спасибо, тема интересная и актуальная. Способ 7 понравился.

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

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

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

    Reply
  4. user748289

    (3)

    Андрей большое Вам Спасибо за комментарий. Мне важно мнение программистов в целом к этой статье. Эту статью без файлов для скачивания написал впервые, она носит чисто информационный характер. Я как и многие учился исключительно сам, а здесь на Инфостарте благодаря отзывам узнаешь много нового, главное это самое новое можно применить. В общем Ваша точка зрения, опыт и замечания надеюсь помогут и мне. Ещё раз благодарю!

    Reply
  5. Art1387

    Насчет проверки даты на ум сразу приходят две вещи:

    1) проверки даты в обработчиках ожидания форм;

    2) повреждение конфигурации запущенной демо-базы в случае несовпадения дат (по крайней мере осложнит взлом путем отладки).

    Reply
  6. Marik

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

    Reply
  7. ArchLord42

    (1) согласен, managed dll, декомплятся прям как закрытые модули 1с, очень легко, тем же дот пиком. Но и тупо обращение к длл, хоть на c ++ тоже не сильно снижает вероятность взлома, если честно, хотя и декомпиляция уже гораздо сложнее даётся.

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

    Reply
  8. grumagargler

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

    Reply
  9. ArchLord42

    (8) только вот если лицензионному потребителю нужно будет модернизировать этот функционал…ему не очень понравится, что он скрыт в DLLке)

    Вспомнил один ооочень хорошой способ, реализовать компоненту, но логика будет во внешней обработке, а обработка будет только подключать внешнюю обработку через ВнешниеОбработки.Подключить(), в пути можно указать путь ко временному хранилищу, а закинуть обработку в теории можно в DLL через тот же AppDistpatch, Потом такую обработку ни как не сохранить и код просмотреть не будет представляться возможности.

    Собственно это я увидел разбирая недавно случай, в конфигурации CRM 3.0 от Раруса которая, у нас был косяк с защитой (они ее обновили не давно), новая защита там работает как раз через ВнешниеОбработки.Подключить, из внешней компоненты получается только двоичные данные обработки, которая отвественна за проверку лицензии, потом они помещаются во временное хранилище и потом уже подключается все это дело, так вот, можно подумать, что защита то ломатеся очень просто, достаточно сохранить эти двоичные данные и посмотреть код обработки, но фича в том, что при поптыке сохраните эти ДД вылетает «ошибка формата потока», видимо есть какой то хак от 1С, которые вешает защиту от сохранения ДД. НО! Мы нашли способ сохранить эти ДД, но это не на публику 🙂

    Reply
  10. oldcopy

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

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

    Reply
  11. SerVer1C

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

    Reply
  12. Totoro

    Не совсем согласен с п 2. — часто после просмотра демо и внесения в неё каких-либо данных клиент хочет обновить её на нормальную. С измененными метаданными могут быть проблемы. Обычно обрезают функционал.

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

    Reply
  13. Бэнни

    Чтобы не воровали демки, единственный оптимальный способ — делать их действительно демо. С кодом демо-продукта. Чтобы не было смысла. Но тогда украдут и распространят после покупки и всего делов. Сначала ворованная будет стоить денег, чтобы отбить стоимость или бесплатной, из спортивного интереса. Обратите внимание на мировой опыт защиты по. Все взламывают. Нужно давать преимущества лицензии кроме полного функционала, чтобы был нужда именно купить. Поддержка, эксклюзивные материалы, эксклюзивный сервис. И можно тогда уже цену не заламывать, как это сейчас происходит. Не покупают не только потому что мудаки, а ещё и потому что порой очень дорого. А ещё внедрение и поддержка. Совокупная стоимость владения может оказаться неподъёмной.

    Reply
  14. Redokov

    Дежавю. Помню, году в 98 читал в Компьютерре статьи Каталова о том, как защищать шароварки. Вот примерно те же самые рекомендации 🙂

    Reply
  15. gradi

    Хорошая статья и интересные варианты защиты.

    Я использую другой вариант — размещаю демо-версию в облаке. Клиент посмотрел, поигрался — меняю пароль и все.

    Reply
  16. user748289

    (16)

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

    Reply
  17. tailer2

    поддержка, вот что есть кусок с маслом

    продать несколько раз — это брюлики продавать надо

    а поддержку прокормит тираж

    кто-нибудь помнит Соболя?

    1С взлетел как минимум вполовину благодаря ему

    сначала люди за тарелку супа «хакеру» ставили ломаную

    а потом — па-бам! — надо обновлять

    а «хакер» давно уже забил на ваши тарелки

    Reply
  18. 🅵🅾️🆇

    > Дата окончания и количество запусков

    Можно же http сервис поднять и к нему обращаться с вопросом, сколько там еще осталось.

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

    Reply
  19. oyti

    Все рекомендации напомнили «Вредные советы» Г. Остера.

    Reply
  20. 1108

    Встречал вариант защиты, когда формы помещали в обработку, а эту обработку помещали в макет в виде двоичных данных.

    Reply
  21. Brawler

    Обфускации, запутывание кода… ничего хорошего не приносят, только производительность падает.

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

    Reply
  22. Steelvan
    На этом все, если статья пригодилась, не забудьте оценить, нажимайте на звёздочку.

    Ога, нажал, только рука немного дернулась 🙂

    Reply
  23. ekaruk

    Каждый год наблюдаю волну обсуждений различных способов защиты.

    Когда-то сама сильно увлеклась этой темой.

    Сейчас пришла к мнению, что для частных разработчиков все эти извращения с защитой не имеют смысла.

    Можно и имена поменять в демке и заморочиться с проверкой времени по внешнему серверу и длл-ками. Но все эти телодвижения очень сильно потом мешают самому и замедляют доработку продукта.

    Гораздо полезнее вложить это же время в доработку функционала и постоянное развитие продукта.

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

    Для 95% процентов 1С-программистов достаточной защитой является поставка без исходного кода.

    1% сломает любую защиту, в том числе и длл.

    Морочиться ради оставшихся 4% не вижу смысла.

    Тут еще есть психологический нюанс. Если человек готов ломать защиту, то он изначально не готов купить. Даже если закрыть так, что он не взломает, то он все равно не купит, а найдет аналог или напишет сам. Фактически никакой пользы (денег от продаж) защита от него все равно не принисёт.

    А вот для нормальных покупателей закрытость в ДЛЛ это большое неудобство, которое может оттолкнуть от покупки.

    Для себя пришла к выводу, что более чем достаточно «поставка без исходного кода»+»обфускация байткода». Большинство 1С-программистов этого не откроют. И добавить такую защиту можно автоматизировано без лишней мороки. Более сложные варианты это потеря времени разработчика.

    Reply
  24. the1

    (21) а эта обработка ещё дополнительно была запароленной и обфусцирована

    Reply
  25. grumagargler

    (24) Зависит от рынка, на которым вы работаете и опыта. Стоимость разработки 100k+ это всего лишь зарплата двух хороших программистов, года на два разработки, и это не считая продвижения, консультантов и прочего. Если есть что защищать – нужно защищать. Ходить потом по судам, даже если вы запатентуете решение – ничего не даст (нам не дало). Есть опыт, когда создавались компании на основе украденных решений с последующим оттоком клиентов. И хочется потом порассуждать о том, что надо хорошо обслуживать, в этом фишка, или открытый исходный код – это модно и т.д. Но всё это в случае, когда на рынке за вас уже всё написали 1С, или ровно до того момента, пока из своего кармана не выложишь за решение стоимость квартиры в большом городе.

    Reply
  26. Marik

    (21) Так часто на семерьке ныкали код, помню было такое. Типа файлы 1c*.* меняли букву c латинскую на c русскую. На восьмерьке давно не видел двоичный код, спрятанный в макеты.

    Reply
  27. Marik

    (24) Интересно, а если вы работаете в команде программистов, и кто-то или группа программистов откололась от основной команды — тогда че? Без сомнения, эти некто откроют новую контору или вольются в другую, и уже скоро на рынке появится ваш брат-близнец-конфигурация с аналогичными предложениями поддержки и прочее, но с более низкой стартовой ценой и тут ваш вариант не прокатит. Речь как раз о том и идет как надежно защитить свой труд или труд своей компании и тут лучше «заморочиться» на этапе проектирования, чем потом с изумлением смотреть как твоя же конфигурация выигрывает тендеры.

    Reply
  28. Nigelist

    + за картинку! =)

    Вот коллекция

    Reply
  29. ekaruk

    (26) В данном случае защита вопрос не технического характера.

    Защита технического характера это от нелицензионного использования отдльными клиентами.

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

    Reply
  30. FesenkoA

    обфускация кода? Да легко, если вы пишете код на английском, а переменные называете «spravachnikPolzavatili» «noviyWtrihkod» итд.. в таком случае тот кто его декомпилирует из закрытого доступа — пожалеет 10 раз. Сталкивался с таким, правда не закрытый код. В итоге пришлось половину переписать..

    Reply
  31. Team leader

    +1, комментарии не менее интересней статьи

    Reply
  32. grumagargler

    (30) Речь не взломанных коробках и их нелегальной продаже, это меньшее зло. Большее, это когда достаются ваши исходные коды, полученные взломом и/или декомпиляцией. Потом, в суде доказывать что-либо будет сложно (если у вас другой практический опыт – поделитесь).

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

    Reply
  33. BigBoss

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

    Reply
  34. AgroTehnik

    (13)Как вариант web клиент)

    Reply
  35. gaglo

    (29) Тоже поставил, потому как люблю издавна картинки Андрея Кузнецова (проект «Чебурген», да и мультики!) Однако на данную статью более всего намекает картинка про чукчу, который (только что вырубил себе сайт изо льда) — «Хехе! Чохча сам пылгэ!…», а сбоку тихо плачет вполне узнаваемый (исключая то, что одет в кухлянку) известный веб-дизайнер….

    По вопросу защиты я присоединяюсь к ekaruk.

    для частных разработчиков все эти извращения с защитой не имеют смысла
    Reply
  36. dnkon

    (9)

    Способ сохранения защищённой обработки озвучивался на ИС и неоднократно — дамп памяти работающего приложения и сохранение участков начинающихся с сигнатуры файла внешней обработки. Никакого секрета в этом давно нет.

    Reply
  37. Serega-artem

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

    (24) Правильно написали, кто настроен на взлом — тот взломает. Или просто найдет другое решение. По методам защиты от себя могу добавить еще одно решение — замена печатных форм на образцы. К примеру, есть документ Реализация, в нем формируется печатная форма ТОРГ 12. В демо макет ТОРГ 12 заменяется на готовую (сформированную форму) и вместо большой процедуры формирования формы пишется пару строк вызова макета-примера. Если конфигурация предназначается во основном для формирования документов (печатных форм) — это неплохой способ защиты, особенно если конфига стоит 10-20 тысяч. Переписывать процедуры заново будет дороже.

    Reply
  38. Mortum

    Пункт 5б часто используется в типовых.

    Reply
  39. amd1986

    Если в продаваемых решениях(не демо) такой изврат, то сжигать на костре таких 1Снеков надо.

    И да, через веб клиент наиболее оптимально демку показывать.

    Reply
  40. user748289

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

    Reply

Leave a Comment

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