Насколько безопасна оценка выражений с помощью eval?
Я создаю веб-сайт, где мне нужно, чтобы пользователь мог иметь возможность оценивать некоторые выражения на основе значений в таблицах БД, а не использовать такие инструменты, как pyparsing и т. Д., Я думаю об использовании самого Python и пришел к решению что достаточно для моей цели. Я в основном использую eval для оценки выражения и передаю dict глобальных переменных с пустым__builtins__
так что ничто не может быть доступно, и местные жители определяют значения из БД, если пользователю понадобятся некоторые функции, я могу передать их тоже, например.
import datetime
def today():
return datetime.datetime.now()
expression = """ first_name.lower() == "anurag" and today().year == 2010 """
print eval(expression, {'__builtins__':{}}, {'first_name':'Anurag', 'today':today})
Итак, мой вопрос, насколько это будет безопасно, у меня есть три критерия
Может ли пользователь получить доступ к текущему состоянию моей программы или таблицы и т.д.?Может ли пользователь иметь доступ к вызовам на уровне ОС?Может ли пользователь остановить мою систему путем зацикливания или использования большого количества памяти, например выполняя диапазон (10 * 8), в некоторых случаях он может, например, 100 ** 1000 и т. д., поэтому 3 не является большой проблемой. я могу проверить такую опцию с помощью tokenize, и в любом случае я буду использовать GAE, так что это не сильно беспокоит.редактироватьИМО это не дубликатQ: 661084 потому что, где это заканчивается, это начинается, я хочу знать, даже с__builtins__
заблокирован, может ли пользователь делать плохие вещи?