首页 / 知识

关于python:“ safe_eval”真的安全吗?

2023-04-13 06:09:00

关于python:“ safe_eval”真的安全吗?

Is “safe_eval” really safe?

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

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

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

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


如果您只需要用Python写下并读取一些数据结构,而不需要执行自定义代码的实际能力,那么这是一个更好的选择:
http://code.activestate.com/recipes/364469-safe-eval/

保证不执行任何代码,仅评估静态数据结构:字符串,列表,元组,字典。


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

1
2
3
4
>>> 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编写自己的评估器即可:

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

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


编写自己的解析器可能很有趣!这可能是一个更好的选择,因为人们希望在输入公式时使用熟悉的电子表格语法(Excel等),而不是Python。我不熟悉safe_eval,但我可以想象像这样的东西肯定有被利用的潜力。


尽管该代码看起来很安全,但我始终认为,只要有足够的时间,任何有足够动力的人都可以破坏它。我确实认为要做到这一点需要相当大的决心,但是我相对确定可以做到。


所需的功能在编译器语言服务中,请参阅
http://docs.python.org/library/language.html
如果您将应用定义为仅接受表达式,则可以将输入编译为表达式,如果不是,则获取异常,例如如果有分号或语句形式。


丹尼尔
Jinja实现了一个沙盒环境,它可能对您有用也可能没有用。据我所知,它还没有"理解"列表的理解。

Sanbox资讯


函数计算安全问题评估

最新内容

相关内容

热门文章

推荐文章

标签云

猜你喜欢