如果我使用 eval() 评估一个 Python 字符串,并且有一个类像这样:
显然,在大多数情况下,没有自定义字典的
class Foo(object):
a = 3
def bar(self, x): return x + a
如果我不信任一个字符串,会有哪些安全风险?特别是:
eval(string, {"f": Foo()}, {})
不安全吗?也就是说,可以从 Foo 实例中访问 os 或 sys 等不安全的内容吗?eval(string, {}, {})
不安全吗?也就是说,可以完全通过内置函数(如 len 和 list)访问 os 或 sys 吗?- 有没有一种方法可以使内置函数在 eval 上下文中根本不存在?
显然,在大多数情况下,没有自定义字典的
eval(string)
是不安全的。
eval('__import__("sys").stdout.write("Hello Joe")')
。 - John La Rooyast.literal_eval(strg)
替换eval(strg)
。 - perpetualstudent