Python:使eval安全

Python:使eval安全,python,eval,Python,Eval,我想要一种用Python编写“计算器API”的简单方法 现在我不太关心计算器将支持的确切功能集 我希望它接收一个字符串,比如说“1+1”,然后返回一个带有结果的字符串,在我们的例子中是“2” 有没有办法让eval对这样的事情安全 首先,我会这样做 env = {} env["locals"] = None env["globals"] = None env["__name__"] = None env["__file__"] = None env["__builtins__"] = Non

我想要一种用Python编写“计算器API”的简单方法

现在我不太关心计算器将支持的确切功能集

我希望它接收一个字符串,比如说
“1+1”
,然后返回一个带有结果的字符串,在我们的例子中是
“2”

有没有办法让
eval
对这样的事情安全

首先,我会这样做

env = {}
env["locals"]   = None
env["globals"]  = None
env["__name__"] = None
env["__file__"] = None
env["__builtins__"] = None

eval(users_str, env)
这样调用者就不会弄乱我的局部变量(或看到它们)

但我相信我在这里监督了很多事情


eval
的安全问题是可以解决的,还是有太多的小细节使其无法正常工作?

安全问题是无法(甚至接近)解决的

我将使用它将表达式解析为标记列表(这应该不会太困难,因为语法很简单),然后分别处理标记

您还可以使用该模块来构建Python AST(因为您使用的是有效的Python语法),但这可能存在一些微妙的安全漏洞

eval的安全问题是否可以解决 是不是有太多的小细节 让它正常工作

肯定是后者——一个聪明的黑客总能设法绕过你的防范措施


如果您对只使用基本类型文本的简单表达式感到满意,那么就使用——这就是它的用途!对于任何喜欢解析的人,我推荐一个解析包,例如如果您熟悉并熟悉经典的lexx/yacc方法,或者推荐一个更具Pythonic风格的方法。

可以访问流程中定义的任何类,然后您可以实例化它并对其调用方法。可以对CPython解释器进行故障切换,或使其退出。见此:

Perl有一个安全评估模块

谷歌搜索“Python等效Perl安全”发现

但是这个Python“受限执行”已被弃用

--

总之,任何语言的“eval”安全性都是一个大问题。SQL注入攻击就是这种安全漏洞的一个例子。Perl Safe多年来一直存在安全漏洞——我记得最近的一个,它是安全的,除了从安全评估返回的对象上的析构函数

这类东西我可以用在我自己的工具上,但不能用在网络上


但是,我希望有一天,完全安全的eval将以多种/任何语言提供。

另请参见:这是否可以解决您的问题?我认为这不起作用,因为我将局部变量和全局变量设置为“无”,因此它们在eval表达式中不可见。@flybywire:抱歉,这是真的;编辑。不过还是个坏主意。@flybywire:@Katrielex你能列出你看到的评估安全问题吗。我在SO上发现了这一点,@jerub提供了一个指向eval问题的链接。除此之外,还有其他需要注意的问题吗?@Ganga,您是否考虑过例如
(1)。\uuuuu class\uuuuuu.\uuuuu base\uuuuu[0]。\uuuu子类\uuuu()
如何为您提供系统中存在的所有类?对于初学者来说…仍然有可能崩溃
ast.literal\u eval
:/它不适用于扩展数学,例如
3*2