繁体   English   中英

“safe_eval”真的安全吗?

[英]Is “safe_eval” really safe?

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

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

如果我使用它(或类似的东西),保护我免受恶意代码的侵害,或者我是否仍然坚持编写自己的解析器,我是否相当安全? 有谁知道更好的选择?

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

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

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

取决于你对安全的定义我想。 很多安全性取决于您传入的内容以及允许您在上下文中传递的内容。 例如,如果传入文件,我可以打开任意文件:

>>> 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沙盒功能。

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

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

Daniel, Jinja实施了一个沙盒环境,可能对你有用,也可能没用 从我记忆中,它还没有“理解”列表理解。

Sanbox信息

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM