Сведения о вопросе

Junior

15:48, 5th August, 2020

Теги

python   security    

Действительно ли "safe_eval" безопасен?

Просмотров: 421   Ответов: 6

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

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

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

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



  Сведения об ответе

PAGE

02:17, 10th August, 2020

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


  Сведения об ответе

+-*/

22:17, 28th August, 2020

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


  Сведения об ответе

DINO

16:42, 22nd August, 2020

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

>>> 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 sandboxing.


  Сведения об ответе

9090

04:23, 20th August, 2020

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

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


  Сведения об ответе

SKY

10:04, 25th August, 2020

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

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


  Сведения об ответе

piter

20:46, 26th August, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться