一尘不染

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. 有没有办法让内置函数在 eval 上下文中根本不存在?

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

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


阅读 91

收藏
2022-06-09

共1个答案

一尘不染

您无法使用这样的黑名单方法保护 eval。请参阅Eval对于会导致 CPython 解释器段错误、允许访问您喜欢的任何类等的输入示例确实很危险。

2022-06-09