Python: сделать eval safe

Я хочу простой способ сделать «калькулятор API» в Python.

Сейчас мне все равно, о том, какой набор функций будет поддерживать калькулятор.

Я хочу, чтобы он получил строку, скажем "1+1" и вернул строку с результатом, в нашем случае "2" .

Есть ли способ сделать eval безопасным для такой вещи?

Для начала я бы сделал

 env = {} env["locals"] = None env["globals"] = None env["__name__"] = None env["__file__"] = None env["__builtins__"] = None eval(users_str, env) 

так что вызывающий не может взаимодействовать с моими локальными переменными (или видеть их).

Но я уверен, что многому занимаюсь здесь.

Являются ли вопросы безопасности eval исправляемыми или есть слишком много мелких деталей, чтобы заставить его работать правильно?

  • Отслеживание приложений фляг не отображается в журнале сервера
  • Определение размера байта матрицы scipy.sparse?
  • Символ Pandas ParserError EOF при чтении нескольких CSV-файлов на HDF5
  • Pyplot - изменить цвет линии, если данные меньше нуля?
  • swig нет модуля с именем _example
  • Эффективное создание нескольких экземпляров numpy.random.choice без замены
  • Как посмотреть сеанс xvfb, находящийся внутри докера на удаленном сервере, из моего локального браузера?
  • Как обрабатывать поступающие данные в реальном времени с помощью python pandas
  • 4 Solutions collect form web for “Python: сделать eval safe”

    являются ли проблемы безопасности eval исправлены или есть слишком много мелких деталей, чтобы заставить его работать правильно?

    Определенно последнее – умный хакер всегда сможет найти способ избежать ваших мер предосторожности.

    Если вас устраивают простые выражения, используя только литералы элементарного типа, используйте ast.literal_eval – вот для чего это! Для чего-нибудь интересного, я рекомендую пакет синтаксического анализа, например, слой, если вы знакомы и комфортно с классическим подходом lexx / yacc или пирарированием для возможного более питонического подхода.

    Можно получить доступ к любому классу, который был определен в процессе, а затем вы можете создать его экземпляр и вызвать на нем методы. Можно выполнить sephfault интерпретатор CPython или заставить его выйти. Смотрите: Eval действительно опасен

    Проблемы с безопасностью не являются (даже близкими) исправлениями.

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

    Вы также можете использовать модуль ast для создания Python AST (поскольку вы используете действительный синтаксис Python), но это может быть открыто для тонких дыр в безопасности.

    Perl имеет безопасный модуль eval http://perldoc.perl.org/Safe.html

    Googling «эквивалент Python Perl Safe» находит http://docs.python.org/2/library/rexec.html

    но этот «ограниченный exec» на Python устарел.

    в целом, безопасность «eval» на любом языке является большой проблемой. Атаки SQL-инъекций – всего лишь пример такой дыры в безопасности. На протяжении многих лет у Perl Safe были проблемы с безопасностью – последнее, что я помню, это было безопасно, за исключением деструкторов на объектах, возвращенных из безопасного eval.

    Это то, что я могу использовать для своих инструментов, но не для Интернета.

    Однако я надеюсь, что когда-нибудь полностью обеспеченные оценки будут доступны на многих языках.

    Python - лучший язык программирования в мире.