Безопасность оценки Python () на недоверяемых строках?

Похоже, вы нуждаетесь в просмотре исходного кода. Doxygen является отличным инструментом для обобщения практически всех аспектов C-проекта. (и многие другие языки). Это OpenSource, и его легко скачать. Кроме того, список функций является обширным.

23
задан Jeff Atwood 3 January 2010 в 09:04
поделиться

5 ответов

eval() позволит вредоносным данным скомпрометировать всю вашу систему, убить вашу кошку, съесть вашу собаку и заняться любовью с вашей женой.

Недавно была тема о том, как безопасно делать подобные вещи в списке python-dev, и были сделаны следующие выводы:

  • Это действительно трудно сделать правильно.
  • Для исправления многих классов атак требуются исправления для интерпретатора Python.
  • Не делай этого, если не хочешь.

Начните здесь, чтобы прочитать о проблеме: http://tav.espians.com/a-challenge-to-break-python-security.html

Что Ситуация вы хотите использовать eval () в? Вы хотите, чтобы пользователь мог выполнять произвольные выражения? Или вы хотите каким-то образом передавать данные? Возможно, можно каким-то образом заблокировать вход.

46
ответ дан 29 November 2019 в 00:44
поделиться

Вы можете добраться до os с помощью встроенных функций: __import__('os').

Для python 2.6+ может помочь модуль ast ; в частности ast.literal_eval, хотя это зависит от того, что именно вы хотите оценить.

10
ответ дан 29 November 2019 в 00:44
поделиться

Обратите внимание, что даже при передаче пустых словарей оценке () это все еще возможно к segfault (C) Python с некоторыми приемами синтаксиса. Например, попробуйте это на своем интерпретаторе: eval("()"*8**5)

6
ответ дан 29 November 2019 в 00:44
поделиться

Возможно, вам лучше перевернуть вопрос:

  1. Какие выражения вы хотите вычислить?
  2. Можете ли вы убедиться, что только строки, соответствующие некоторому узко определенному синтаксису, являются eval () d?
  3. Затем рассмотрим, если , что безопасно.

Например, если вы хотите позволить пользователю вводить алгебраическое выражение для оценки, рассмотрите возможность его ограничения именами букв, чисел и определенного набора операторов и функций. Не проверяйте строки (), содержащие что-либо еще.

4
ответ дан 29 November 2019 в 00:44
поделиться

Есть очень хорошая статья о небезопасности eval() в учебнике Марка Пилигрима "Погружение в Питон".

Цитата из этой статьи:

В конце концов, можно безопасно оценить недоверенные выражения Пайтона, для некоторого определения "безопасного", что оказывается не очень полезным для реальная жизнь. Ничего страшного, если ты просто играешь, и ничего страшного, если ты только передайте ему доверенные данные. Но всё остальное просто просит проблема.

2
ответ дан 29 November 2019 в 00:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: