Как я могу поиграть в песочнице Python в чистом Python?

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

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

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

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

51
задан Blixt 17 June 2010 в 21:34
поделиться

7 ответов

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

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

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

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

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

44
ответ дан 7 November 2019 в 10:20
поделиться

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

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

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

6
ответ дан 7 November 2019 в 10:20
поделиться

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

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

В документации отмечается, что пакет компилятора отсутствует в Python 3.0, но не упоминается, что такое альтернатива 3.0.

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

2
ответ дан 7 November 2019 в 10:20
поделиться

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

2
ответ дан 7 November 2019 в 10:20
поделиться

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

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

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

0
ответ дан 7 November 2019 в 10:20
поделиться

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

0
ответ дан 7 November 2019 в 10:20
поделиться

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

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

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

Ответ может быть примерно таким

{hp='+5' action={destroy_inventory_item, inventory_id='1234'}}
3
ответ дан 7 November 2019 в 10:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: