Если я оцениваю строку 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)
без пользовательских словарей в большинстве случаев небезопасно.
eval('__import__("sys").stdout.write("Hello Joe")')
- person John La Rooy   schedule 07.12.2010