Перейти к содержанию
#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.

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

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

Варианты ограничения:

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

При наличии подсистемы «Регламентные задания» БСП для первого варианта вызывайте в начале обработчика задания РегламентныеЗаданияСервер.УстановитьСлужебногоПользователяРегламентногоЗадания.

См. также
Источники