Защита внешней обработки 1С — прячем и шифруем MXL-макет

Защита внешней обработки 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). А теперь самое главное: ставим пароль на модуль нашей внешней обработки — МойСекретныйПароль, иначе все наши выкрутасы с шифрованием-дешифрованием — коту под хвост. Конечно кто-то скажет, что данную защиту можно взломать, и конечно он окажется прав, потому что взломать можно ЛЮБУЮ ЗАЩИТУ. Идеальной защиты не существует, как впрочем, и ничего идеального …

Скачать обработку

Если публикация помогла Вам справится с проблемой, решить задачу или расширить свои знания - поддержите автора.

Комментарии:

  1. Alex:

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

    1. Администратор:

      Спасибо за комментарий, пользуйтесь на здоровье 🙂

  2. raveness:

    Достаточно временную папку разместить на NAS диске и промониторить запись на диск, в результате получим искомый MXL-файл в папке «#recycle» или ей подобной. Это если задаться целью.

  3. Владимир:

    Я вот что думаю — можно ведь этот MXL загнать в виде строки и зашифровать её штатными средствами 1С 8.

    Пример:

    КартинкаВСтроке = «iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAACXBIWXMAAAs6AAAL
    |………………………………………………………………………..
    |ujrT3bm9rjkq7W4ecfs3lmbmB36b7myfam1RD4uRZdVJksmo/w8QKxDHSNf5ZQAA
    |AABJRU5ErkJggg==»;
    КартинкаВДвоичныхДанных = Base64Значение(КартинкаВСтроке);
    Картинки.Вставить(«Бонус1»,Новый Картинка(КартинкаВДвоичныхДанных));

    1. Администратор:

      Можно, тогда последовательность операций будет примерно такая:
      Процедура кодировки:
      1). Готовим заранее MXL-макет(или любые другие данные) и сохраняем в виде файла на диске «СекретныйМакет.MXL»
      2). Создаем отдельную обработку для кодировки:
      ДвоичныеДанныеМакета = Новый ДвоичныеДанные(«СекретныйМакет.MXL»);
      СтрокаДвоичныхДанных = ЗначениеBase64(ДвоичныеДанныеМакета );
      // К СтрокаДвоичныхДанных применяем свой алгоритм шифрования, например примитивный XOR с ключом.
      ШифрованнаяСтрока = ЗашифроватьПоМоемуАлгоритму(СтрокаДвоичныхДанных);
      Сообщить(ШифрованнаяСтрока);
      3). Полученную шифрованную строку вставляем в текстовый макет результирующей обработки.

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

  4. Felix:

    действительно полезно )

Оставить комментарий