"Safe_eval" действительно безопасно? - PullRequest
4 голосов
/ 26 августа 2008

Я ищу "безопасную" функцию eval для реализации вычислений, подобных электронным таблицам (используя numpy / scipy).

Функциональность для этого (модуль rexec ) была удалена из Python с 2.3 из-за явно нерешаемых проблем безопасности. Есть несколько сторонних хаков, которые намереваются сделать это - самое продуманное решение, которое я нашел, это этот рецепт Python Cookbok , "safe_eval".

Достаточно ли безопасен я, если я использую это (или что-то подобное) для защиты от вредоносного кода, или я застрял в написании собственного парсера? Кто-нибудь знает какие-нибудь лучшие альтернативы?

EDIT: я только что обнаружил RestrictedPython , который является частью Zope. Любые мнения по этому поводу приветствуются.

Ответы [ 6 ]

2 голосов
/ 26 августа 2008

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

1 голос
/ 02 августа 2011

Если вам просто нужно записать и прочитать некоторую структуру данных в Python, и вам не нужна реальная возможность выполнения пользовательского кода, этот вариант лучше подходит: http://code.activestate.com/recipes/364469-safe-eval/

Гарантирует, что код не выполняется, оцениваются только статические структуры данных: строки, списки, кортежи, словари.

1 голос
/ 28 августа 2008

Зависит от вашего определения сейфа, я полагаю. Безопасность в значительной степени зависит от того, что вы передаете и что вам разрешено передавать в контексте. Например, если файл передан, я могу открыть произвольные файлы:

>>> names['f'] = open('foo', 'w+')
>>> safe_eval.safe_eval("baz = type(f)('baz', 'w+')", names)
>>> names['baz']
<open file 'baz', mode 'w+' at 0x413da0>

Кроме того, среда очень ограничена (вы не можете передавать модули), поэтому вы не можете просто передать модуль функций утилит, таких как re или random.

С другой стороны, вам не нужно писать собственный анализатор, вы можете просто написать собственный оценщик для python ast:

>>> import compiler
>>> ast = compiler.parse("print 'Hello world!'")

Таким образом, мы надеемся, вы могли бы реализовать безопасный импорт. Другая идея заключается в использовании Jython или IronPython и использовании возможностей песочницы Java / .Net.

1 голос
/ 27 августа 2008

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

0 голосов
/ 07 января 2012

Функциональность, которую вы хотите, находится в языковых службах компилятора, см. http://docs.python.org/library/language.html Если вы определяете свое приложение для приема только выражений, вы можете скомпилировать входные данные как выражение и получить исключение, если это не так, например, если есть точки с запятой или формы заявления.

0 голосов
/ 28 августа 2008

Daniel, Jinja реализует среду песочницы, которая может быть полезной для вас Из того, что я помню, это еще не «постигает» понимание списка.

Информация о Sanbox

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...