Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

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

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

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

{hp='+5' action={destroy_inventory_item, inventory_id='1234'}}

Ответ 5

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

Вы можете использовать compiler пакет parse script. Затем вы можете пройти это дерево, префикс всех идентификаторов - переменных, имен методов e.t.c. (также has|get|setattr invocations и т.д.) - с уникальной преамбулой, чтобы они не могли ссылаться на ваши переменные. Вы также можете убедиться, что сам пакет compiler не был вызван и, возможно, другие черные записи, такие как открытие файлов. Затем вы выбрали для этого код python и compiler.compile it.

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

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