“safe_eval”真的安全吗?

Posted

技术标签:

【中文标题】“safe_eval”真的安全吗?【英文标题】:Is "safe_eval" really safe? 【发布时间】:2010-09-06 21:38:10 【问题描述】:

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

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

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

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

【问题讨论】:

您可以使用 Resolver One 在电子表格中使用 scipy/numpy。 resolversystems.com 【参考方案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 ast 编写自己的评估器:

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

这样,希望您可以实施安全导入。另一个想法是使用 Jython 或 IronPython 并利用 Java/.Net 沙盒功能。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

Sanbox info

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于“safe_eval”真的安全吗?的主要内容,如果未能解决你的问题,请参考以下文章

掌上折扣app是真的吗安全吗

私有方法真的安全吗?

哈希机制真的安全吗?

$_POST 真的安全吗?

HTTPS 真的安全吗?

“getenv ...函数...可能不安全”-真的吗?