Защита внешней обработки 1С — прячем и шифруем MXL-макет
Данная статья посвящена одному из способов защиты макета табличного документа, содержащегося во внешней обработке 1С, от несанкционированного использования. Как защитить модуль внешней обработки от «чайника» знают все — поставить на него пароль. А что делать если основную ценность обработки представляет не только модуль но и макет табличного документа содержащий множество различных секций, который Вы рисовали не одну ночь. За примером далеко ходить не надо — посмотрите на любую форму Госкомстата.
Ну что, поехали — постановка задачи: защитить макет табличного документа внешней обработки.
1). Сохраняем наш супер-макет табличного документа в MXL-файл — МойМакет.mxl
2). Удаляем его из обработки.
3). Архивируем МойМакет.mxl с помощью архиватора в формате ZIP, ОБЯЗАТЕЛЬНО С ПАРОЛЕМ — МойСекретныйПароль, получаем файл МойМакет.zip
4). Добавляем в нашу обработку макет типа Двоичные данные, называем его ШифрованныйМакет и загружаем в него файл МойМакет.zip
5). В форме обработки:
Процедура КнопкаВыполнитьНажатие(Кнопка) Печать("ШифрованныйМакет"); КонецПроцедуры
6). В модуле обработки:
Процедура Печать(ИмяМакета) экспорт ИмяMXLфайла = "МойМакет.mxl"; // Извлекаем файл ZIP из макета и сохраняем во временный файл ИмяВременногоФайлаZIP = ПолучитьИмяВременногоФайла("zip"); ДвоичныеДанные = ПолучитьМакет(ИмяМакета); ДвоичныеДанные.Записать(ИмяВременногоФайлаZIP); // Извлекаем из ZIP-архива MXL-файл и сохраняем его во временный файл ЧтениеZIP = Новый ЧтениеZipФайла(ИмяВременногоФайлаZIP, "МойСекретныйПароль"); ЭлементZIPАрхива = ЧтениеZIP.Элементы.Найти(ИмяMXLфайла); ЧтениеZIP.Извлечь(ЭлементZIPАрхива, КаталогВременныхФайлов(), РежимВосстановленияПутейФайловZIP.НеВосстанавливать); ЧтениеZIP.Закрыть(); // Получаем макет табличного документа из MXL-файла Макет = Новый ТабличныйДокумент; Макет.Прочитать(КаталогВременныхФайлов()+ ИмяMXLфайла); // Заметаем следы УдалитьФайлы(КаталогВременныхФайлов()+ИмяMXLфайла); УдалитьФайлы(ИмяВременногоФайлаZIP); // Показываем результирующий табличный документ пользователю Табличныйдокумент = Новый ТабличныйДокумент; ОбластьМакета = Макет.ПолучитьОбласть("Область1|Область2"); Для Счетчик1 = 1 по 10 цикл Табличныйдокумент.Вывести(ОбластьМакета); Для Счетчик2 = 1 по 4 цикл Табличныйдокумент.Присоединить(ОбластьМакета); КонецЦикла; КонецЦикла; Табличныйдокумент.Защита=Истина; Табличныйдокумент.Показать(); КонецПроцедуры
7). А теперь самое главное: ставим пароль на модуль нашей внешней обработки — МойСекретныйПароль, иначе все наши выкрутасы с шифрованием-дешифрованием — коту под хвост. Конечно кто-то скажет, что данную защиту можно взломать, и конечно он окажется прав, потому что взломать можно ЛЮБУЮ ЗАЩИТУ. Идеальной защиты не существует, как впрочем, и ничего идеального …
Если публикация помогла Вам справится с проблемой, решить задачу или расширить свои знания - поддержите автора.
Комментарии:
Чтобы оставить комментарий, Вы должны войти в систему.
Хорошая идея использовать двоичные данные. Сам ее используя, только для хранения шифрованных обработок в конфигурации. А вот по поводу шифрования макета отчета раньше не задумывался. Ставлю (+).
Спасибо за комментарий, пользуйтесь на здоровье 🙂
Достаточно временную папку разместить на NAS диске и промониторить запись на диск, в результате получим искомый MXL-файл в папке «#recycle» или ей подобной. Это если задаться целью.
Я вот что думаю — можно ведь этот MXL загнать в виде строки и зашифровать её штатными средствами 1С 8.
Пример:
КартинкаВСтроке = «iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAACXBIWXMAAAs6AAAL
|………………………………………………………………………..
|ujrT3bm9rjkq7W4ecfs3lmbmB36b7myfam1RD4uRZdVJksmo/w8QKxDHSNf5ZQAA
|AABJRU5ErkJggg==»;
КартинкаВДвоичныхДанных = Base64Значение(КартинкаВСтроке);
Картинки.Вставить(«Бонус1»,Новый Картинка(КартинкаВДвоичныхДанных));
Можно, тогда последовательность операций будет примерно такая:
Процедура кодировки:
1). Готовим заранее MXL-макет(или любые другие данные) и сохраняем в виде файла на диске «СекретныйМакет.MXL»
2). Создаем отдельную обработку для кодировки:
ДвоичныеДанныеМакета = Новый ДвоичныеДанные(«СекретныйМакет.MXL»);
СтрокаДвоичныхДанных = ЗначениеBase64(ДвоичныеДанныеМакета );
// К СтрокаДвоичныхДанных применяем свой алгоритм шифрования, например примитивный XOR с ключом.
ШифрованнаяСтрока = ЗашифроватьПоМоемуАлгоритму(СтрокаДвоичныхДанных);
Сообщить(ШифрованнаяСтрока);
3). Полученную шифрованную строку вставляем в текстовый макет результирующей обработки.
Соответственно дешифрация производится в запоролированном модуле внешней обработки (отчета), в последовательности обратной вышеописанным действиям.
действительно полезно )