当前位置: 首页 / 技术分享 / 正文
好程序员Python培训之详解eval好与坏

2020-11-06

Python培训

  好程序员Python培训之详解eval好与坏,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面我们一起来看一下吧。

Python2

  evalPython的一个内置函数,这个函数的作用是,返回传入字符串的表达式的结果。想象一下变量赋值时,将等号右边的表达式写成字符串的格式,将这个字符串作为eval的参数,eval的返回值就是这个表达式的结果。

  pythoneval函数的用法十分的灵活,但也十分危险,安全性是其最大的缺点。本文从灵活性和危险性两方面介绍eval

  1、强大之处

  举几个例子感受一下,字符串与listtupledict的转化。

  a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"

  b = eval(a)

  b

  Out[3]: [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]

  type(b)

  Out[4]: list

  a = "{1: 'a', 2: 'b'}"

  b = eval(a)

  b

  Out[7]: {1: 'a', 2: 'b'}

  type(b)

  Out[8]: dict

  a = "([1,2], [3,4], [5,6], [7,8], (9,0))"

  b = eval(a)

  b

  Out[11]: ([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))

  强大吧,给个字符串给evaleval给你一个表达式返回值。

  eval的语法格式如下:

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

  expression:字符串

  globals:变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。

  locals:变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

  结合globalslocals看看几个例子

  传递globals参数值为{age:1822}

  eval("{'name':'linux','age':age}",{"age":1822})

  输出结果:{name':linux',age':1822}

  再加上locals变量

  age=18

  eval("{'name':'linux','age':age}",{"age":1822},locals())

  根据上面两个例子可以看到当locals参数为空,globals参数不为空时,查找globals参数中是否存在变量,并计算。

  当两个参数都不为空时,先查找locals参数,再查找globals参数,locals参数中同名变量会覆盖globals中的变量。

  2、危险之处

  eval虽然方便,但是要注意安全性,可以将字符串转成表达式并执行,就可以利用执行系统命令,删除文件等操作。

  假设用户恶意输入。比如:

  eval("__import__('os').system('ls /Users/chunming.liu/Downloads/')")

  那么eval()之后,你会发现,当前文件夹文件都会展如今用户前面。这句其实相当于执行了

  os.system('ls /Users/chunming.liu/Downloads/')

  那么继续输入:

  eval("__import__('os').system('cat /Users/chunming.liu/Downloads/tls_asimov_cert.pem')")

  代码都给人看了。

  再来一条删除命令,文件消失。比如

  eval("__import__('os').system('rm /Users/chunming.liu/Downloads/车辆转发测试.png')")

  所以使用eval,一方面享受他的了灵活性同时,也要注意安全性。

  以上关于好程序员Python培训之详解eval强大与危害详解整合,希望对大家有所帮助,想要了解更多关于Python和人工智能方面内容的小伙伴,请关注好程序员Python培训官网、微信公众号等平台

Python培训:http://www.goodprogrammer.org/python_class.shtml

好程序员公众号

  • · 剖析行业发展趋势
  • · 分享大厂面试心得
  • · 汇聚企业项目源码
  • · 下载全套高精尖教程

好程序员开班动态

More+
  • HTML5大前端 <高端班>

    开班时间:2020-11-16(北京)

    开班盛况

    开班时间:2020-12-07(深圳)

    预约报名
  • 大数据+人工智能 <高端班>

    开班时间:2020-09-14(北京)

    开班盛况

    开班时间:2020-11-09(北京)

    开班盛况
  • JavaEE分布式开发 <高端班>

    开班时间:2021-01-04(北京)

    预约报名

    开班时间:2020-07-20(北京)

    开班盛况
  • Python人工智能+数据分析 <高端班>

    开班时间:2020-07-20(上海)

    开班盛况

    开班时间:2020-09-21(上海)

    开班盛况
  • 云计算开发 <高端班>

    开班时间:2019-07-22(北京)

    开班盛况

    开班时间:2019-07-15(深圳)

    开班盛况
在线咨询
免费试听
入学教程
立即报名

Copyright 2011-2020 北京千锋互联科技有限公司 .All Right 京ICP备12003911号-5 京公安网11010802011455号