2012-03-17 1 views
4

Я хочу разрешить пользователям создавать свои собственные «моды» Python для моей игры, разместив их скрипты в специальной папке, которую «сканирует» для модулей Python и импорта. Каким будет самый простой способ предотвратить «опасные» сценарии от импорта? Я не хочу, чтобы люди жаловались мне, что они использовали чей-то мод, и он стирал жесткий диск. Вещи, которые я хотел бы ограничить, - это доступ/изменение/создание любых файлов за пределами их папки и подключение к Интернету/загрузка/отправка данных. Если вы можете что-нибудь сказать, дайте мне знать.Python modding - предотвратить импорт опасных сценариев?

Как это можно сделать?

+2

Там нет простого способа обеспечить разумное количество песочниц. * Особенно, если для файлов потребуется некоторый объем доступа к диску. – delnan

+0

Тогда каковы же трудные пути? Я думал, что, по крайней мере, это будет способ предотвратить импорт определенных модулей в будущем. –

+0

pypy обеспечивает более сложную песочницу, но у меня нет информации о том, как встроить ее в свою игру. – sleeplessnerd

ответ

2

Ограниченный Python, по-видимому, способен ограничить функциональность кода чистым способом и совместим с pyth до 2,7.

http://pypi.python.org/pypi/RestrictedPython/

например,

Подавая другой словарь __builtins__, мы можем исключить опасные операции, такие как открытие файлов [...]

0

Очевидным способом сделать это является загрузка модуля в виде строки и exec. Это имеет столько же рисков безопасности, но может быть проще блокировать с помощью пользовательских globals и locals. Посмотрите на this question - это дает некоторые действительно хорошие рекомендации по этому вопросу. Как отмечалось в комментариях Дельнана, это еще не полностью безопасно.

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

+1

Обратите внимание, что это будет просто делать вещи немного сложнее для злокачественных моддеров. Это вовсе не комплексная песочница. – delnan

+0

"пользовательские глобальные и местные жители"? –

+0

@ delnan: Правильно. Я добавлю это к моему ответу. – aquavitae

0

Есть некоторые серьезные недостатки для выполнения песочницы python. ответ от aquavitae на хорошее обсуждение этого вопроса, особенно this blog post. Прочтите это первым.

В cPython есть ядро ​​безопасного выполнения. Основная идея заключается в замене __builtins__ global (Примечание: не модуль __builtin__), который информирует python о включении некоторых функций безопасности; делая несколько атрибутов на некоторых недоступных объектах и ​​удаляя большую часть объектов реализации из интерпретатора при эвакуации этого бита кода.

Вам необходимо будет написать фактическую реализацию; таким образом, чтобы защищенные модули не просочились в песочницу. A fairly tested "file" replacement is provided в связанном блоге. Взгляд на это может дать вам представление о том, насколько сложна и сложна эта проблема.

Итак, теперь, когда вы поняли, что это вызов в python; вы должны взглянуть на языки с исполнением песочницы в качестве основной функции, например Lua, которая очень популярна в играх.

0

Предоставление им исполнения python и попытка ограничить то, что они делают, задавая проблемы. См. this SO question для обсуждения и указатель на хорошую статью. (Вы предположительно отключили бы «eval», но на практике это не имело бы большого значения.

Мое предложение: Поверните вопрос вокруг. Ваша цель - предоставить им средства для создания сценариев, чтобы они могли улучшить игру. определите интерпретатор для подходящего языка сценариев, в котором есть необходимые функции, и используйте его для выполнения своих сценариев. Например, вы можете поддерживать постоянство данных в простой модели хранилища ключей, не предоставляя им доступ к созданию файлов. Или дать им команду создайте файлы, но убедитесь, что они принимают только имя файла без указания пути. Существенно, чтобы гарантировать, что им не удастся выполнить команды python напрямую.

Смежные вопросы