警惕eval()的安全漏洞

eval() 函数用来执行一个字符串表达式,并返回表达式的值。

eval(expression[, globals[, locals]])

expression -- 表达式。
globals -- 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。
locals -- 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

如果传入globals参数的字典缺少__builtins__的时候,当前全局命名空间将作为globals参数输入并且在表达式计算之前被解析。locals参数默认与globals相同,如果两者都省略的话,表达式将在eval()调用的环境中执行。

如果要将字符串型的list,tuple,dict转变成原有的类型,可以用eval()

In [10]: str_list = '[1,2,3,4]'

In [11]: eval(str_list)
Out[11]: [1, 2, 3, 4]
In [13]: str_dict = "{'age':20}"

In [14]: eval(str_dict)
Out[14]: {'age': 20}

eval还可以对字符串型的输入直接计算。

In [16]: a = eval('1+5')

In [17]: a
Out[17]: 6

In [18]: type(a)
Out[18]: int

eval()能对解析的字符串都做处理,而不顾忌可能带来的后果!

在实际应用过程中如果使用对象不是信任源,应该尽量避免使用eval,在需要使用eval的地方可以用安全性更好的ast.literal_eval替代。

官方说明:https://docs.python.org/3.6/library/ast.html?highlight=ast%20literal_eval#ast.literal_eval

ast模块就是帮助Python应用来处理抽象的语法解析的。而该模块下的literal_eval()函数:则会判断需要计算的内容计算后是不是合法的python类型,如果是则进行运算,否则就不进行运算。

你可能感兴趣的:(警惕eval()的安全漏洞)