“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”真的安全吗?的主要内容,如果未能解决你的问题,请参考以下文章