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

发布于 2022-07-28 23:13:30

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

关注者
0
被浏览
43
1 个回答
  • 面试哥
    面试哥 2022-07-28
    为面试而生,有面试问题,就找面试哥。

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看