#std770¶
Ограничения на использование Выполнить и Вычислить на сервере¶
1.¶
В общем случае рекомендуется отказаться от исполнения произвольного кода через Выполнить и Вычислить.
Рекомендация не относится к неизменному внешнему коду, который можно проверить заранее: расширению перед подключением администратором, внешнему отчету или обработке перед интерактивным открытием. Проверяйте источник кода и, если опубликована, его хеш-сумму.
2.¶
Пользовательские формулы рекомендуется собирать из предусмотренных составляющих и вычислять без Выполнить и Вычислить.
2.1.¶
Если формулу нельзя представить набором предусмотренных составляющих, вычисляйте ее в безопасном режиме. Дополнительно исключите вызовы методов платформы и функций конфигурации, кроме явно предусмотренных.
При использовании БСП рекомендуется применять подсистему КонструкторФормул.
3.¶
Опасность представляет не только код, введенный пользователем, но и строки, собранные из параметров серверных методов: как из данных клиента, так и из базы.
Например, разработчик помещает строку в структуру на клиенте, передает ее через серверный метод формы в общий модуль и исполняет там.
Злоумышленник может подменить структуру и добиться выполнения своего кода.
Риск выше, если принимающий метод находится в общем модуле с признаком ВызовСервера.
Для клиентского кода действует отдельный стандарт.
4.¶
Если отказаться от Выполнить и Вычислить невозможно, выполняйте следующие требования.
4.1.¶
Перед динамическим выполнением включайте безопасный режим. В модели сервиса включайте также безопасный режим разделения данных для разделителей конфигурации.
УстановитьБезопасныйРежим(Истина);
Для каждого ИмяРазделителя Из РазделителиКонфигурации() Цикл
УстановитьБезопасныйРежимРазделенияДанных(ИмяРазделителя, Истина);
КонецЦикла;
Выполнить Алгоритм;
При использовании БСП применяйте:
ОбщегоНазначения.ВыполнитьВБезопасномРежиме()вместоВыполнить;ОбщегоНазначения.ВычислитьВБезопасномРежиме()вместоВычислить.
4.2.¶
Предотвращайте вызовы методов платформы, процедур и функций конфигурации, не предусмотренных для конкретного сценария.
4.3.¶
Технологические динамические вызовы, например вызов процедуры по полному имени, рекомендуется заменять прямыми.
Если это невозможно, проверяйте корректность каждой части имени через точку и передавайте параметры через обращение к переменной типа Массив.
Проверку размещайте непосредственно перед Выполнить или Вычислить в том же методе.
При использовании БСП вместо самостоятельного формирования строки вызова применяйте:
ОбщегоНазначения.ВыполнитьМетодКонфигурации();ОбщегоНазначения.ВыполнитьМетодОбъекта().
В механизмах встраивания библиотек рекомендуется передавать имя общего модуля или полное имя менеджера объекта, сохраняя имя вызываемой процедуры фиксированным.
Фиксированное имя обработчика
В общих модулях, модулях менеджеров и объектов, методы которых вызываются через ВыполнитьМетодКонфигурации или ВыполнитьМетодОбъекта, требуется экспортная процедура с перечнем разрешенных методов:
// См. СтандартныеПодсистемыСервер.ПриОпределенииМетодовРазрешенныхДляВызоваКакПроизвольныйКод
Процедура ПриОпределенииМетодовРазрешенныхДляВызоваКакПроизвольныйКод(Методы) Экспорт
Методы.Вставить("УстановкаПараметровСеанса"); // Пример для модуля ПользователиСлужебный.
КонецПроцедуры
Имена перечисляйте строковыми литералами, без переменных и вызовов других методов для получения имен. Допускается условное добавление имени в зависимости от наличия подсистемы.
Процедуру можно размещать без учета обычных требований к разделам модулей из стандартов #std455, #std644 и #std551. Для удобства поиска рекомендуется конец модуля, последняя область. Такое размещение сохраняет обратную совместимость.
При вызове БСП проверяет перечень и вызывает исключение, если метод не разрешен.
Переход между версиями БСП
В редакции ИТС за сентябрь 2026 года описано поведение будущих версий: в БСП 3.2.2 и 3.1.13 (если будет) отсутствие процедуры разрешений допускает вызов любого метода модуля; начиная с БСП 3.2.3 и 3.1.14 (если будет) отсутствие процедуры приводит к исключению. Это описание перехода не подтверждает выпуск перечисленных версий.
4.4.¶
Если произвольный код не работает в безопасном режиме, например требует доступа к файлам, замените его внешним кодом, который можно проверить перед подключением.
- Оформите код как расширение, внешнюю обработку или отчет.
- Передайте администратору на аудит, указав необходимость небезопасного режима.
- После проверки администратор подключает расширение либо помещает обработку или отчет в специальный справочник, доступный на запись только ответственному за безопасность.
- Вместо
ВыполнитьилиВычислитьвызывайте экспортный метод проверенного расширения или подключенной обработки.
В БСП используйте общую форму Расширения подсистемы «Базовая функциональность» либо подсистему «Дополнительные отчеты и обработки».
4.5.¶
Регламентные задания по умолчанию запускаются под полными правами. Безопасный режим не уменьшает права пользователя, от имени которого работает сеанс задания. Поэтому пользовательская формула может получить доступ к данным и действиям, не предусмотренным разработчиком.
Для задания, исполняющего произвольный код, программно создайте и назначьте служебного пользователя с ограниченными правами.
Варианты ограничения:
- рекомендуется пустой список ролей: читать и изменять данные в привилегированном режиме, а произвольный код вычислять в безопасном режиме, который отключает привилегированный;
- для одноразового задания можно назначить реального пользователя;
- можно назначить специальные роли чтения таблиц, необходимых алгоритму.
При наличии подсистемы «Регламентные задания» БСП для первого варианта вызывайте в начале обработчика задания РегламентныеЗаданияСервер.УстановитьСлужебногоПользователяРегламентногоЗадания.
См. также¶
- #std801: Ограничения на использование Выполнить и Вычислить на клиенте
- #std669: Ограничение на выполнение внешнего кода
- #std678: Безопасность прикладного программного интерфейса сервера
- #std642: Длительные операции на сервере
- Облачные технологии