5

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

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

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

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

4

6 回答 6

3

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

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

于 2008-08-28T11:35:19.353 回答
2

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

于 2008-08-26T15:44:31.190 回答
2

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

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

于 2011-08-02T09:19:57.147 回答
1

尽管该代码看起来很安全,但我一直认为,只要有足够的时间,任何有足够动力的人都可以破解它。我确实认为这需要相当大的决心才能度过难关,但我相对肯定它是可以做到的。

于 2008-08-27T02:37:05.973 回答
0

Daniel, Jinja实现了一个沙盒环境,可能对您有用,也可能没用。据我记得,它还没有“理解”列表推导。

沙盒信息

于 2008-08-28T10:12:03.873 回答
0

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

于 2012-01-06T22:41:54.357 回答