Python在不受信任字符串上的val()安全性?
如果我正在使用val()计算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吗? - 是否有一种方法可以使内建物在val上下文中完全不存在?
有一些不安全的字符串,如“[0]*100000000”,我不关心,因为最坏的情况下,它们会减慢/停止程序。我主要关心的是保护程序外部的用户数据。
显然,eval(string)
没有自定义词典在大多数情况下是不安全的。