如果我正在使用 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 上下文中根本不存在?
有一些不安全的字符串,例如“[0] * 100000000”我不在乎,因为在最坏的情况下它们会减慢/停止程序。我主要关心保护程序外部的用户数据。
显然,eval(string)
在大多数情况下,没有自定义词典是不安全的。