Ограничения на использование "Выполнить" и "Вычислить" на сервере
-
При разработке решений следует учитывать, что опасно не только непосредственное выполнение кода, написанного в режиме Предприятие, но и те места, где методами Выполнить или Вычислить исполняется код, сконструированный на основе параметров, переданных в серверные функции и процедуры. Ограничение не распространяется на код, выполняемый на клиенте.
Например, код написан следующим образом:
- в клиентской функции в форме создается структура, в которую вставляется строка, написанная разработчиком конфигурации;
- клиентская функция передает эту структуру в серверную функцию формы;
- серверная функция формы вызывает серверную функцию общего модуля;
- в серверной функции исполняется код из строки, вставленной в структуру.
В этом случае не выполняется код, который интерактивно вводит пользователь, но, тем не менее, есть следующая уязвимость:
- злоумышленник создает структуру, в которую вставляет строку с вредоносным кодом;
- злоумышленник вызывает клиентскую функцию формы и таким образом исполняет вредоносный код на сервере.
Еще опаснее, если методы, в которых с помощью
Выполнить
илиВычислить
исполняется код, принимаемый из параметров, будут располагаться в модулях с установленным признаком ВызовСервера. -
Для исключения описанных уязвимостей, нужно в серверных процедурах и функциях вызов методов
Выполнить
илиВычислить
предварять включением безопасного режима:УстановитьБезопасныйРежим(Истина); Выполнить Алгоритм;
В режиме сервиса, включение безопасного режима должно учитывать разделение данных, т.е. приведенный выше пример 4 необходимо доработать следующим образом:
``` УстановитьБезопасныйРежим(Истина);
Для каждого ИмяРазделителя Из РазделителиКонфигурации() Цикл УстановитьБезопасныйРежимРазделенияДанных(ИмяРазделителя, Истина); КонецЦикла;
Выполнить Алгоритм; ```
При использовании в конфигурации Библиотеки стандартных подсистем, следует использовать:
ОбщегоНазначения.ВыполнитьВБезопасномРежиме()
вместоВыполнить
;ОбщегоНазначения.ВычислитьВБезопасномРежиме()
вместоВычислить
;ОбщегоНазначения.ВыполнитьМетодКонфигурации()
вместо формирования строки вызова метода модуля и передачи ее вВыполнить
;ОбщегоНазначения.ВыполнитьМетодОбъекта()
вместо формирования строки вызова метода объекта и передачи ее вВыполнить
.
При использовании в конфигурации Библиотеки стандартных подсистем версии, меньшей чем 2.4.1, следует использовать:
РаботаВБезопасномРежиме.ВыполнитьВБезопасномРежиме()
вместоВыполнить
;РаботаВБезопасномРежиме.ВычислитьВБезопасномРежиме()
вместоВычислить
;РаботаВБезопасномРежиме.ВыполнитьМетодКонфигурации()
вместо формирования строки вызова метода модуля и передачи ее вВыполнить
;РаботаВБезопасномРежиме.ВыполнитьМетодОбъекта()
вместо формирования строки вызова метода объекта и передачи ее вВыполнить
.
-
Если произвольный код не может быть успешно выполнен в безопасном режиме (например, в нем используется обращение к файлам), то такой код должен предварительно пройти аудит и должен быть размещен в справочнике, к которому есть доступ только у пользователя ответственного за безопасность (например, администратора). Предлагается следующий сценарий работы с внешним кодом:
- внешний код рекомендуется поместить во внешнюю обработку или отчет (в крайнем случае, допустимо передать его, как фрагмент текста);
- передать внешний код администратору с пометкой, что необходимо выполнение кода в небезопасном режиме;
- администратор или сотрудник с соответствующей квалификацией должен выполнить аудит полученного кода;
- если код безопасен и надежен, администратор поместит внешний код в специальный справочник, доступ на запись в который есть только у него;
- вместо
Выполнить
илиВычислить
следует (или): подключить проверенную обработку из справочника и вызвать необходимый экспортный метод; вызвать фрагмент кода с помощью специальной процедуры или функции, которая централизованно в конфигурации выполняет внешний код.
При использовании в конфигурации Библиотеки стандартных подсистем, для этих целей следует воспользоваться подсистемой Дополнительные отчеты и обработки.
-
Если конфигурация рассчитана на работу в модели сервиса, и в конфигурации предусмотрен перенос данных в сервис из локальной версии программы, необходимо обеспечить отключение всех пользовательских фрагментов кода или текстов запросов, которые были введены в локальной версии.
При использовании в конфигурации Библиотеки стандартных подсистем, также имеется возможность предварительной обработки данных, загружаемых из локальной версии в сервис (см. документацию к подсистеме Работа в модели сервиса).
См. также
- Ограничения на использование Выполнить и Вычислить на сервере
- Ограничения на выполнение «внешнего» кода на сервере
- Безопасность прикладного программного интерфейса сервера
- Облачные технологии
Экранирование кода
// sonar:ExecuteExport:off
// sonar:ExecuteExport:on