2008-08-26 69 views
3

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

自从2.3版本以来,由于显然不可修复的安全问题,此功能(rexec module)已从Python中删除。有几个第三方攻击者声称要这样做 - 我发现的最深思熟虑的解决方案是 this Python Cookbok recipe,“safe_eval”。

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

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

+0

您可以使用Resolver One在电子表格中使用scipy/numpy。 http://www.resolversystems.com/ – 2009-07-25 15:32:25

回答

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的实用功能。

在另一方面,你不需要编写自己的解析器,你可以只写自己的评估为蟒蛇AST:

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

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

2

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

1

虽然这段代码看起来相当安全,但我始终认为任何有足够动机的人在给定足够时间的情况下可能会破坏它。我认为这需要相当多的决心,但我相对确定它可以完成。

0

Daniel, Jinja实现了一个对您可能有用或不可用的沙箱环境。从我记忆中,它还没有“理解”列表理解。

Sanbox info

1

如果你只需要简单地写下来,并在阅读一些Python数据结构,并且不需要执行自定义代码的实际能力,这是一个更好的贴合: http://code.activestate.com/recipes/364469-safe-eval/

它garantees无码被执行,只评估静态数据结构:字符串,列表,元组,字典。

0

你想要的是在编译语言服务,请参阅 http://docs.python.org/library/language.html 如果您的应用定义为只接受表达式,你可以编译输入作为一个表达式,得到一个异常,如果它不是功能,例如如果有分号或声明表单。