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

2024-04-25 07:26:28 发布

您现在位置: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)是不安全的。


Tags: 字符串self程序stringreturnobjectfooos
3条回答

您可以使用内置函数os

对于Python2.6+,虽然ast module完全取决于要计算的内容,但它可能有帮助;特别是ast.literal_eval

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

最近,在python dev列表中有一个关于如何安全地做这种事情的线程,其结论是:

  • 这真的很难做到。
  • 它需要python解释器的补丁来阻止许多类的攻击。
  • 除非你真的想做,否则不要做。

从这里开始阅读挑战:http://tav.espians.com/a-challenge-to-break-python-security.html

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

你不能用这样的黑名单方法来保证eval的安全。请参阅Eval really is dangerous以获取输入示例,这些输入将使CPython解释器出现故障,允许您访问任何喜欢的类,等等。

相关问题 更多 >