一尘不染

“ safe_eval”真的安全吗?

python

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

由于明显的不可修复的安全性问题,自2.3起,已从Python中删除了执行此功能的功能(rexec模块)。有一些第三方黑客声称可以做到这一点-
我发现的最周到的解决方案是 此Python
Cookbok食谱
“ safe_eval”。

如果使用此命令(或类似方法)来保护自己免受恶意代码的侵害,我是否相当安全?还是我坚持编写自己的解析器?有谁知道更好的选择吗?

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


阅读 245

收藏
2021-01-20

共1个答案

一尘不染

我想取决于您对保险柜的定义。许多安全性取决于您传入的内容以及上下文中允许通过的内容。例如,如果传入文件,则可以打开任意文件:

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

此外,环境非常受限制(您不能传递模块),因此,您不能简单地传递诸如re或random之类的实用程序功能的模块。

另一方面,您不需要编写自己的解析器,只需为python ast编写自己的评估器即可:

>>> import compiler
>>> ast = compiler.parse("print 'Hello world!'")

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

2021-01-20