“safe_eval”真的安全吗?

dF.*_*dF. 5 python security

我正在寻找一个“安全”的 eval 函数来实现类似电子表格的计算(使用 numpy/scipy)。

由于明显无法修复的安全问题,执行此操作的功能(rexec 模块)自 2.3 以来已从 Python 中删除。有几个第三方黑客声称这样做 - 我发现的最深思熟虑的解决方案是 这个 Python Cookbok recipe,“safe_eval”。

如果我使用它(或类似的东西)来防止恶意代码,我是否相当安全,或者我是否坚持编写自己的解析器?有谁知道任何更好的选择?

编辑:我刚刚发现了RestrictedPython,它是 Zope 的一部分。欢迎对此提出任何意见。

Aar*_*paa 3

我想这取决于你对安全的定义。安全性很大程度上取决于您传入的内容以及上下文中允许您传递的内容。例如,如果传入一个文件,我可以打开任意文件:

>>> names['f'] = open('foo', 'w+')
>>> safe_eval.safe_eval("baz = type(f)('baz', 'w+')", names)
>>> names['baz']
<open file 'baz', mode 'w+' at 0x413da0>
Run Code Online (Sandbox Code Playgroud)

此外,环境非常有限(你不能传入模块),因此,你不能简单地传入像 re 或 random 这样的实用函数模块。

另一方面,您不需要编写自己的解析器,您可以为 python ast 编写自己的求值器:

>>> import compiler
>>> ast = compiler.parse("print 'Hello world!'")
Run Code Online (Sandbox Code Playgroud)

这样,您就有希望实现安全导入。另一个想法是使用 Jython 或 IronPython 并利用 Java/.Net 沙箱功能。