一尘不染

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

python

如果我正在使用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)在大多数情况下,没有自定义词典是不安全的。


阅读 492

收藏
2020-02-21

共2个答案

一尘不染

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

2020-02-21
一尘不染

eval() 将允许恶意数据破坏你的整个系统,杀死猫,吃狗并与妻子做爱。

最近在python-dev列表上有一个关于如何安全地执行此类操作的线程,其结论是:

  • 正确地做到这一点真的很难。
  • 它需要python解释器的补丁程序才能阻止许多类型的攻击。
  • 除非你确实要这么做,否则不要这样做。
    从这里开始阅读有关挑战的信息:http : //tav.espians.com/a-challenge-to-break-python-security.html

你想在什么情况下使用eval()?你是否希望用户能够执行任意表达式?还是你想以某种方式传输数据?也许可以以某种方式锁定输入。

2020-02-21