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

执行此操作的功能( 重新执行模块)由于明显无法修复的安全问题,自 2.3 起已从 Python 中删除。有几个第三方黑客声称可以做到这一点 - 我发现的最深思熟虑的解决方案是这个 Python Cookbok 食谱, ,“安全评估”。

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

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

有帮助吗?

解决方案

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

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

其他提示

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

尽管该代码看起来非常安全,但我始终认为,任何有足够动机的人都可以在足够的时间内破解它。我确实认为这需要很大的决心才能完成,但我相对确定这是可以做到的。

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

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

丹尼尔,金贾 实现一个沙箱环​​境,可能对您有用,也可能没有用。据我记得,它还没有“理解”列表理解。

沙箱信息

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top