我正在寻找一个“安全”的评估函数,以实现类似电子表格的计算(使用numpy / scipy)。
由于明显无法解决的安全问题,自2.3以来已经从Python中删除了执行此操作的功能(rexec module)。有几个第三方黑客在那里声称这样做 - 我发现最经过深思熟虑的解决方案 this Python Cookbok recipe,“safe_eval”。
如果我使用这个(或类似的东西),保护我免受恶意代码的侵害,或者我是否一直在编写自己的解析器,我是否相当安全?有没有人知道更好的选择?
编辑:我刚刚发现了RestrictedPython,这是Zope的一部分。欢迎提出任何意见。答案 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实现了一个沙盒环境,可能对您有用,也可能对您没用。从我记忆中,它还没有“理解”列表理解。
答案 5 :(得分:0)
您需要的功能在编译器语言服务中,请参阅 http://docs.python.org/library/language.html 如果您将应用程序定义为仅接受表达式,则可以将输入编译为表达式,如果不是,则可以获得异常,例如:如果有分号或陈述形式。