Как я могу изолировать Python в чистом Python? - PullRequest
48 голосов
/ 18 июня 2010

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

Было бы неплохо, если бы языком сценариев был Python.Однако он не может работать с доступом к среде, в которой запускается игра, поскольку злонамеренный пользователь может нанести ущерб, что было бы плохо.Возможно ли запустить изолированную версию Python на чистом Python?

Обновление : На самом деле, поскольку истинная поддержка Python была бы излишней, простой язык сценариев с синтаксисом Pythonic был бы идеальным.

Если нет никаких интерпретаторов сценариев Pythonic, есть ли другие интерпретаторы сценариев с открытым исходным кодом, написанные на чистом Python, которые я мог бы использовать?Требованиями являются поддержка переменных, базовых условий и вызовов функций (не определений).

Ответы [ 8 ]

43 голосов
/ 18 июня 2010

Это на самом деле нетривиально.

Существует два способа «песочницы» Python.Один из них - создать ограниченную среду (т. Е. Очень мало глобальных переменных и т. Д.) И exec ваш код внутри этой среды.Это то, что предлагает Месса.Это хорошо, но есть много способов вырваться из песочницы и создать проблемы.Примерно год назад на Python-dev была тема, в которой люди делали что-то от перехвата исключений и поиска внутреннего состояния, чтобы перейти к манипулированию байтовым кодом.Это путь, если вам нужен законченный язык.

Другой способ - проанализировать код и затем использовать модуль ast, чтобы удалить ненужные конструкции (например, операторы import, функциязвонки и т. д.), а затем собрать все остальное.Это тот путь, если вы хотите использовать Python в качестве языка конфигурации и т. Д.

Другой способ (который может не сработать для вас, поскольку вы используете GAE) - это PyPy sandbox .Хотя я сам этим не пользовался, на межтрубках говорят, что это единственный настоящий Python в песочнице.

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

5 голосов
/ 18 июня 2010

AFAIK возможно запустить код в полностью изолированной среде:

exec somePythonCode in {'__builtins__': {}}, {}

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

4 голосов
/ 06 июля 2012

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

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

Я не уверен, как именно реализованы скрипты Python, но эта функция была примерно с 2000 года.

А вот волшебство PythonScripts с подробной документацией: http://pypi.python.org/pypi/RestrictedPython - похоже, что он не имеет никаких зависимостей от Zope, поэтому может использоваться автономно.

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

Это ответ из моего комментария на вопрос, закрытый как дубликат этого: Python от Python: ограничение функциональности?

3 голосов
/ 18 июня 2010

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

Вот и абстрактный пример лечебного зелья.

{function_id='healing potion', action='use', target='self', inventory_id='1234'}

Ответ может быть что-то вроде

{hp='+5' action={destroy_inventory_item, inventory_id='1234'}}
2 голосов
/ 18 июня 2010

Возможно, вас заинтересует раздел Python Language Services в libref для написания вашего собственного анализатора.

2 голосов
/ 18 июня 2010

Хм. Это мысленный эксперимент, я не знаю, как это делается:

Вы можете использовать пакет compiler для parse сценария. Затем вы можете пройти по этому дереву, добавив префиксы ко всем идентификаторам - переменным, именам методов и т. Д. (также has|get|setattr вызовов и т. д.) - с уникальной преамбулой, чтобы они не могли ссылаться на ваши переменные. Вы также можете убедиться, что сам пакет compiler не был вызван, и, возможно, другие занесенные в черный список вещи, такие как открытие файлов. Затем вы выдаете код Python для этого, и compiler.compile it.

Документы отмечают, что пакет compiler отсутствует в Python 3.0, но не упоминает, что такое альтернатива 3.0.

В целом, это параллельно с тем, как программное обеспечение форума и тому подобное пытаются внести в белый список «безопасный» Javascript или HTML e.t.c. И у них исторически сложилась плохая репутация топать все побеги. Но вам больше повезет с Python:)

0 голосов
/ 18 июня 2010

Я думаю, что вашей лучшей ставкой будет комбинация ответов до сих пор.

Вы захотите проанализировать и очистить входные данные - например, удалив любые операторы импорта.

Затем вы можете использовать образец exec Мессы (или что-то подобное), чтобы разрешить выполнение кода только для встроенных переменных по вашему выбору - скорее всего, какой-то определенный вами API, который предоставляет программисту доступ к функциональность, которую вы считаете релевантной.

0 голосов
/ 18 июня 2010

Вы найдете некоторые идеи в этой вики-странице , но, похоже, это не так просто сделать.

...