如果我正在使用eval()评估Python字符串,并且具有类似这样的类:
class Foo(object): a = 3 def bar(self, x): return x + a
如果我不信任该字符串,会有哪些安全风险?尤其是:
我不关心一些不安全的字符串,例如“ [0] * 100000000”,因为在最坏的情况下,它们会减慢/停止程序。我主要关心的是保护程序外部的用户数据。
显然,eval(string)在大多数情况下,没有自定义词典是不安全的。
您不能使用这样的黑名单方法来保护评估。请参阅Eval确实很危险,以获取输入示例,这些输入将对CPython解释器进行段隔离,提供对您喜欢的任何类的访问,等等。
eval() 将允许恶意数据破坏你的整个系统,杀死猫,吃狗并与妻子做爱。
eval()
最近在python-dev列表上有一个关于如何安全地执行此类操作的线程,其结论是:
你想在什么情况下使用eval()?你是否希望用户能够执行任意表达式?还是你想以某种方式传输数据?也许可以以某种方式锁定输入。