Защита внешней обработки 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. Felix пишет:

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

  2. Владимир пишет:

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

    Пример:

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

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

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

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

  3. raveness пишет:

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

  4. Alex пишет:

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

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

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

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