Если я оцениваю строку Python с помощью eval() и имею класс вроде:
class Foo(object):
a = 3
def bar(self, x): return x + a
Каковы риски безопасности, если я не доверяю строке? В частности:
- Является ли
eval(string, {"f": Foo()}, {})
небезопасным? То есть, вы можете достичь os или sys или что-то небезопасное из экземпляра Foo? - Является ли
eval(string, {}, {})
небезопасным? То есть, могу ли я получить os или sys целиком из встроенных функций, таких как len и list? - Есть ли способ заставить встроенные компоненты вообще не присутствовать в контексте eval?
Есть некоторые небезопасные строки типа "[0] * 100000000" Меня не волнует, потому что в худшем случае они замедляют/останавливают программу. Я в первую очередь обеспокоен защитой пользовательских данных, внешних по отношению к программе.
Очевидно, что eval(string)
без пользовательских словарей в большинстве случаев небезопасно.