Возможна ли песочница в конфигурационном файле Python? - PullRequest
1 голос
/ 18 ноября 2009

Я думаю о реализации файла конфигурации, написанного на синтаксисе Python, мало чем отличающегося от того, что делает Django.

Пока я видел один или два ТАК о достоинствах использования исполняемого кода в файлах конфигурации, мне интересно, есть ли способ выполнить файл конфигурации код в «песочнице», чтобы ошибки в коде не блокировали хост-приложение.

Поскольку хост-приложение является инструментом программиста, меня не интересует преподавание синтаксиса Python или введение дыр в безопасности, как упомянуто как минимум в еще одном вопросе SO . Но меня беспокоит код конфигурации , переходящий на Fishkill и заклинивающий хост-приложение. Я бы предпочел, чтобы хост-приложение перехватывало эти проблемы и отображало диагностическую информацию об ошибках.

Кто-нибудь пробовал такого рода песочницу для файла конфигурации Python? И если да, то какие методы оказались полезными и какие подводные камни возникли, о которых я должен знать?

Ответы [ 2 ]

3 голосов
/ 13 сентября 2010

Мы делаем это для некоторых наших внутренних инструментов

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

Суть подхода заключается в запуске сценария в заблокированном исполнении.

  1. Сначала мы пройдемся по встроенному модулю __ и найдем все, к чему мы не хотим прикасаться, особенно __ import __. Мы фактически делаем это в менеджере контекста, который поддерживает исходные значения и удаляет их при входе, а затем восстанавливает исходные значения при выходе.

  2. Далее мы создаем пустой словарь, который будет пространством имен скриптов конфигурации.

  3. Затем мы выполняем конфигурацию с пространством имен.

  4. Exec, конечно, завернут в попытку, за исключением того, что поймает что-нибудь.

  5. И, наконец, мы проверяем пространство имен для извлечения интересующих нас переменных.

Здесь стоит отметить:

  1. Может быть заманчиво предварительно заполнить пространство имен вещами, которые могут быть полезны для скрипта конфигурации, но вы должны быть очень осторожны, быстро открывая хуки обратно в хост-программу.

  2. Скрипты конфигурации могут по-прежнему создавать функции и классы, так что вы можете получить что-то похожее на строку, например, но на самом деле это произвольный двоичный объект исполняемого кода.

Из-за этого мы накладываем ограничение на то, что наши конфигурационные скрипты должны генерировать чистые примитивные структуры данных (обычно только целые, строки, списки, кортежи и None), которые мы затем проверяем отдельно.

2 голосов
/ 18 ноября 2009

К сожалению, вы ничего не можете сделать с этой проблемой со стандартным Python. Когда интерпретатор Python выполняет «код конфигурации», этот код может делать все, что ему нравится, включая доступ к программе хоста или отсутствие возврата управления. Запуск кода конфигурации в отдельном процессе может помочь, но также ограничит взаимодействие между хостом и кодом конфигурации.

Лучше всего было бы проверить возможность песочницы проекта PyPy . Это может быть то, что вам нужно, но также может потребовать много усилий с вашей стороны для интеграции.

Есть ли альтернатива rexec для изолированной среды Python? также обсуждает эту тему.

Вы, вероятно, также должны спросить себя, насколько важна эта проблема для вас. Я думаю, это зависит от вашего варианта использования и того, кто будет писать код конфигурации.

...