Python的eval()在不受信任的字符串上的安全性吗?
如果我正在使用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吗?
- 有没有办法使内置插件在评估环境中根本不存在?
我不关心一些不安全的字符串,例如“ [0] * 100000000”,因为在最坏的情况下,它们会减慢/停止程序。我主要关心的是保护程序外部的用户数据。
显然,eval(string)在大多数情况下,没有自定义词典是不安全的。
回答:
您不能使用这样的黑名单方法来保护评估。请参阅Eval确实很危险,以获取输入示例,这些输入将对CPython解释器进行段隔离,提供对您喜欢的任何类的访问,等等。
以上是 Python的eval()在不受信任的字符串上的安全性吗? 的全部内容, 来源链接: utcz.com/qa/416840.html