Home

Tags

Sandbox in Python, restricted execution

2013-03-12 python sandbox

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

Пример с exec

src = '''
result = 0
for i in xrange(100):
    result += i
'''

assert '__' not in src, 'Prohibited to use symbols "__"'
pr = compile(src, '<string>', mode='exec')
glob = { '__builtins__':{ 'xrange':xrange } }
exec(pr, glob)
print glob['result']


Пример с eval (для вычисления выражения)
src = 'max(5,7,3)'
glob = { '__builtins__':{ 'max':max } }
assert '__' not in src, 'Prohibited to use symbols "__"'
print eval(src, glob)


Основные моменты - это:
assert '__' not in src, 'Prohibited to use symbols "__"'
- запрет доступа к спец объектам, на подобии: __class__, __base__
через которые можно получить полный доступ к python
и
glob = { '__builtins__':{ 'xrange':xrange } }
тут мы заменяем весь базовый функционал (import, type...) на нужный/разрешенный функционал.

Так же нельзя давать использовать метод getattr.

На данный момент нет известного способа обойти этот "sandbox".