警惕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类型,如果是则进行运算,否则就不进行运算。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 内置函数Python解释器内置了许多功能和类型,总是可用的。他们是按字母顺序列在这里。 abs(x)返回一个数的绝...
    uangianlap阅读 1,373评论 0 0
  • 1、abs() 描述: 函数返回数字的绝对值 语法:abs() 参数:x--数值表达式,可以是整数,浮点数,...
    清清子衿木子水心阅读 537评论 0 0
  • 个人笔记,方便自己查阅使用 Py.LangSpec.Contents Refs Built-in Closure ...
    freenik阅读 67,950评论 0 5
  • 人人尽道春光好,乌伤四月芳菲老。 桃杏共争青,枇杷花尽情。 东君着赤履,鸟语呼君起。 人世暮春时,流年当握持。
    天道长存阅读 493评论 0 2
  • 投资理财基金是稳健投资之一 1·基金是什么? 基金,就是将投资者的钱集中起来,由专业基金公司以投资组合的方式进行证...
    五彩冰峰阅读 262评论 0 0

友情链接更多精彩内容