Я создаю веб-сайт, на котором мне нужно, чтобы пользователь мог оценить какое-либо выражение на основе значения в таблицах БД, вместо использования таких инструментов, как pyparsing и т. Д., Я думаю об использовании самого python и придумал решение чего достаточно для моей цели. Я в основном использую eval для оценки выражения и передачи глобальных dict с пустым __builtins__
, чтобы ничего нельзя было получить, и локальный dict для значений из БД, если пользователю понадобятся некоторые функции, я могу передать их, например,
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})
Итак, мой вопрос, насколько это безопасно, у меня есть три критерия.
- Может ли пользователь получить доступ к текущему состоянию моей программы или таблицы и т. Д. Someshow?
- Может ли пользователь иметь доступ к вызовам уровня ОС?
- Может ли пользователь остановить мою систему зацикливанием или использованием большого количества памяти, например. выполнив range (10 * 8), в некоторых случаях он может, например, 100 ** 1000 и т. д., поэтому 3 не является большой проблемой. Я могу проверить такую операцию с помощью tokenize, и в любом случае я буду использовать GAE, поэтому это не вызывает особого беспокойства.
Изменить: ИМО, это не дубликат Q: 661084, потому что где он заканчивается, этот начинается, я хочу знать, может ли пользователь делать что-то плохое, даже если __builtins__
заблокирован?