Ага, я вижу, что релиз последней PySandbox (1,5) не ведут себя, как вы описываете. Я пытался на ветку гит-мастера.
Для вопроса 1, я не думаю, что есть прямые варианты с PySandbox 1.5. Код был написан специально, чтобы попытаться запретить модификацию или передачу какого-либо состояния во встроенной песочнице. sandbox.call(eval, CODE)
не является хорошим вариантом, так как вы не можете легко пройти в пространствах имен локалей и глобалов (вы можете попробовать, но песочница будет проксировать их, а затем eval() будет терпеть неудачу, потому что locals и globals должны быть реальными dicts) , И я считаю, что вы хотите, чтобы здесь были установлены местные жители и глобальные сообщества.
Вопрос 2 не является простым, по тем же причинам. Обе эти возможности возможны в текущей ветке git master, но неясно, связано ли это с ошибками или по дизайну :)
Итак, вот решение обоих вопросов, которое расширяет функциональность песочницы и использует то, что, вероятно, означает быть частным интерфейсом, но по-прежнему должны быть безопасными, как песочница иначе:
from sandbox.proxy import proxy
from sandbox.sandbox_class import _call_exec
def proxyNamespace(d):
return dict((str(k), proxy(v)) for k, v in d.iteritems())
def wrapeval(codestr, globs, locs):
subglobs = proxyNamespace(globs)
sublocs = proxyNamespace(locs)
return eval(codestr, subglobs, sublocs)
def eval_in_sandbox(sandbox, codestr, globs=None, locs=None):
if globs is None:
globs = {}
if locs is None:
locs = globs
return sandbox._call(wrapeval, (codestr, locs, globs), {})
def exec_in_sandbox_with_mutable_namespace(sandbox, codestr, globs=None, locs=None):
if globs is None:
globs = {}
if locs is None:
locs = globs
subglobs = proxyNamespace(globs)
sublocs = proxyNamespace(locs)
sandbox._call(_call_exec, (codestr, subglobs, sublocs), {})
globs.update(subglobs)
locs.update(sublocs)
Теперь все, что сказал, я настоятельно рекомендую не базировать безопасность любого фактического кода производства или системы на этом PySandbox модуль. Просматривая код, кажется, что он полностью пронизан недостатками и дырками. Я не думаю, что для того, чтобы найти пути мимо такого рода безопасности, понадобится атакующему больше часа или около того. Я также не думаю, что это подверглось серьезному анализу со стороны специалистов по безопасности или даже очень большой части сообщества в целом. Если вы хотите запустить ненадежный код и не сможете вообще повлиять на ваш процесс, вам нужно что-то большее, возможно, основанное на AppArmor или что-то в этом роде. Если вас беспокоит только случайный неправильный код, а не вредоносный, это может быть хорошо, но я на самом деле даже не уверен в этом.
Мы смотрим на тот же Pysandbox - тот, который находится на https://github.com/haypo/pysandbox?Ваш второй пример, кажется, работает без ошибок для меня, и первый выглядит так, как будто он просит sandbox.call (lambda: 2 + 2). –
Да, это тот же модуль. Во втором примере была сделана ошибка в том, что объект доступен только для чтения. Что касается eval, я хочу функцию, которая автоматически пытается eval, так что мне не нужно будет анализировать входные данные, чтобы определить, является ли это кодом, гарантирующим eval vs. exec. – Zach
Возможно, существует разница в том, как вы настраиваете свою изолированную программную среду , Не могли бы вы опубликовать весь сценарий и ошибку, возникающую при попытке обновления? –