Если я оцениваю строку 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)
без пользовательских словарей в большинстве случаев небезопасно.