Запуск "безопасного" eval()

Я делаю бот IRC https://github.com/mouuff/MouBot Я хотел бы, чтобы бот отвечал на eval() когда сообщение начинается с!math, но создает ошибки, если пользователь вводит что-то вроде!math exit() и тому подобное

5 ответов

Решение

Не.

Похоже, вы пытаетесь создать математический парсер. Затем используйте математический парсер, а не полноценный парсер I-will-run-any-code-parser. Если вы используете *nix, вы можете использовать такую ​​программу, как bc делать то, что вы хотите.

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

Пример реализации предоставлен unutbu

Я не уверен, что это могло бы помочь вам, но посмотрите на это -> http://doc.pypy.org/en/latest/sandbox.html

или это -> Есть ли альтернатива rexec для песочницы Python?

Вопрос с eval() является то, что когда он выполняется, это действительный код Python, и exit() является допустимой частью кода Python, который обычно завершает работу программы (хотя эту особую функцию следует использовать в IDLE, и sys.exit() предпочтительнее в режиме бездействия).

По этой причине, eval() должен использоваться только с доверенным вводом, или вы должны реализовать парсер для команд, переданных eval() функция, чтобы устранить нежелательный ввод (возможно, взглянуть на shlex модуль для их split() функция, если вы хотите реализовать свой собственный, я использовал его для многих парсеров).

Если вам нужна простая математическая оценка, почему вы хотите использовать всю мощь Python, что может и будет использовано неправильно.

Используйте что-то вроде PyParsing для написания простого калькулятора, например, см. SimpleCalc.py или fournfn.py, я думаю, этого будет достаточно, чтобы вы начали. Вы также можете попробовать SimpleParse

и если вы действительно хотите предоставить eval-подобную мощную и удобную функцию, вы должны запустить виртуальную машину, в которой запускаются серверные процессы, которые будут отвечать на запросы eval, а также ограничивать каждый процесс с помощью cgroups; когда виртуальная машина выйдет из строя, запустите другую или сохраните пул VM и Eval процессов.

Другие вопросы по тегам