Перейти к содержанию

Ограничения на использование "Выполнить" и "Вычислить" на сервере

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

    Например, код написан следующим образом:

    • в клиентской функции в форме создается структура, в которую вставляется строка, написанная разработчиком конфигурации;
    • клиентская функция передает эту структуру в серверную функцию формы;
    • серверная функция формы вызывает серверную функцию общего модуля;
    • в серверной функции исполняется код из строки, вставленной в структуру.

    В этом случае не выполняется код, который интерактивно вводит пользователь, но, тем не менее, есть следующая уязвимость:

    • злоумышленник создает структуру, в которую вставляет строку с вредоносным кодом;
    • злоумышленник вызывает клиентскую функцию формы и таким образом исполняет вредоносный код на сервере.

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

  2. Для исключения описанных уязвимостей, нужно в серверных процедурах и функциях вызов методов Выполнить или Вычислить предварять включением безопасного режима:

    УстановитьБезопасныйРежим(Истина); Выполнить Алгоритм;

    В режиме сервиса, включение безопасного режима должно учитывать разделение данных, т.е. приведенный выше пример 4 необходимо доработать следующим образом:

    ``` УстановитьБезопасныйРежим(Истина);

    Для каждого ИмяРазделителя Из РазделителиКонфигурации() Цикл УстановитьБезопасныйРежимРазделенияДанных(ИмяРазделителя, Истина); КонецЦикла;

    Выполнить Алгоритм; ```

    При использовании в конфигурации Библиотеки стандартных подсистем, следует использовать:

    • ОбщегоНазначения.ВыполнитьВБезопасномРежиме() вместо Выполнить;
    • ОбщегоНазначения.ВычислитьВБезопасномРежиме() вместо Вычислить;
    • ОбщегоНазначения.ВыполнитьМетодКонфигурации() вместо формирования строки вызова метода модуля и передачи ее в Выполнить;
    • ОбщегоНазначения.ВыполнитьМетодОбъекта() вместо формирования строки вызова метода объекта и передачи ее в Выполнить.

    При использовании в конфигурации Библиотеки стандартных подсистем версии, меньшей чем 2.4.1, следует использовать:

    • РаботаВБезопасномРежиме.ВыполнитьВБезопасномРежиме() вместо Выполнить;
    • РаботаВБезопасномРежиме.ВычислитьВБезопасномРежиме() вместо Вычислить;
    • РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации() вместо формирования строки вызова метода модуля и передачи ее в Выполнить;
    • РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта() вместо формирования строки вызова метода объекта и передачи ее в Выполнить.
  3. Если произвольный код не может быть успешно выполнен в безопасном режиме (например, в нем используется обращение к файлам), то такой код должен предварительно пройти аудит и должен быть размещен в справочнике, к которому есть доступ только у пользователя ответственного за безопасность (например, администратора). Предлагается следующий сценарий работы с внешним кодом:

    • внешний код рекомендуется поместить во внешнюю обработку или отчет (в крайнем случае, допустимо передать его, как фрагмент текста);
    • передать внешний код администратору с пометкой, что необходимо выполнение кода в небезопасном режиме;
    • администратор или сотрудник с соответствующей квалификацией должен выполнить аудит полученного кода;
    • если код безопасен и надежен, администратор поместит внешний код в специальный справочник, доступ на запись в который есть только у него;
    • вместо Выполнить или Вычислить следует (или): подключить проверенную обработку из справочника и вызвать необходимый экспортный метод; вызвать фрагмент кода с помощью специальной процедуры или функции, которая централизованно в конфигурации выполняет внешний код.

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

  4. Если конфигурация рассчитана на работу в модели сервиса, и в конфигурации предусмотрен перенос данных в сервис из локальной версии программы, необходимо обеспечить отключение всех пользовательских фрагментов кода или текстов запросов, которые были введены в локальной версии.

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

См. также

Экранирование кода

// sonar:ExecuteExport:off
// sonar:ExecuteExport:on