Python的eval()在不受信任的字符串上的安全性吗?

如果我正在使用eval()评估Python字符串,并且具有类似这样的类:

class Foo(object):

a = 3

def bar(self, x): return x + a

如果我不信任该字符串,会有哪些安全风险?尤其是:

  1. 是eval(string, {“f”: Foo()}, {})不安全的?也就是说,你可以从Foo实例访问os或sys还是不安全的东西?
  2. 是eval(string, {}, {})不安全的?也就是说,我可以完全通过len和list之类的内置工具访问os或sys吗?
  3. 有没有办法使内置插件在评估环境中根本不存在?

我不关心一些不安全的字符串,例如“ [0] * 100000000”,因为在最坏的情况下,它们会减慢/停止程序。我主要关心的是保护程序外部的用户数据。

显然,eval(string)在大多数情况下,没有自定义词典是不安全的。

回答:

您不能使用这样的黑名单方法来保护评估。请参阅Eval确实很危险,以获取输入示例,这些输入将对CPython解释器进行段隔离,提供对您喜欢的任何类的访问,等等。

以上是 Python的eval()在不受信任的字符串上的安全性吗? 的全部内容, 来源链接: utcz.com/qa/416840.html

回到顶部