“safe_eval”真的安全吗?

时间:2008-08-26 15:27:04

标签: python security

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

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

如果我使用这个(或类似的东西),保护我免受恶意代码的侵害,或者我是否一直在编写自己的解析器,我是否相当安全?有没有人知道更好的选择?

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

6 个答案:

答案 0 :(得分:2)

编写自己的解析器可能很有趣!这可能是一个更好的选择,因为人们期望在输入公式时使用熟悉的电子表格语法(Excel等)而不是Python。我不熟悉safe_eval,但我认为这样的事情肯定有可能被剥削。

答案 1 :(得分:1)

尽管该代码看起来非常安全,但我始终认为任何有足够动力的人都可以在足够的时间内打破它。我认为通过这项工作需要相当多的决心,但我相信我们可以做到。

答案 2 :(得分: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编写自己的求值器:

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

这样,希望你能实现安全的进口。另一个想法是使用Jython或IronPython并利用Java / .Net沙盒功能。

答案 3 :(得分:1)

如果您只需要在Python中记下并读取一些数据结构,并且不需要执行自定义代码的实际容量,那么这个更适合: http://code.activestate.com/recipes/364469-safe-eval/

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

答案 4 :(得分:0)

丹尼尔, Jinja实现了一个沙盒环境,可能对您有用,也可能对您没用。从我记忆中,它还没有“理解”列表理解。

Sanbox info

答案 5 :(得分:0)

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