Python:使eval安全
我想要一种用Python编写“计算器API”的简单方法 现在我不太关心计算器将支持的确切功能集 我希望它接收一个字符串,比如说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
“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
。