浅谈Python中eval的强大与危害


Posted in Python onMarch 13, 2019

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

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

1、强大之处

举几个例子感受一下,字符串与list、tuple、dict的转化。

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))

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

eval的语法格式如下:

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

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

结合globals和locals看看几个例子
传递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安装
Sep 12 Python
使用Python对Excel进行读写操作
Mar 30 Python
zookeeper python接口实例详解
Jan 18 Python
TensorFlow神经网络优化策略学习
Mar 09 Python
Python实现的FTP通信客户端与服务器端功能示例
Mar 28 Python
Python实现的生产者、消费者问题完整实例
May 30 Python
如何利用python web框架做文件流下载的实现示例
Jun 02 Python
Python configparser模块操作代码实例
Jun 08 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
Aug 07 Python
Python Selenium自动化获取页面信息的方法
Aug 31 Python
利用Python优雅的登录校园网
Oct 21 Python
python中使用np.delete()的实例方法
Feb 01 Python
详解python中init方法和随机数方法
Mar 13 #Python
Python使用sqlalchemy模块连接数据库操作示例
Mar 13 #Python
python ---lambda匿名函数介绍
Mar 13 #Python
Python实现的列表排序、反转操作示例
Mar 13 #Python
Python实现的调用C语言函数功能简单实例
Mar 13 #Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
Mar 13 #Python
浅谈python标准库--functools.partial
Mar 13 #Python
You might like
对squid中refresh_pattern的一些理解和建议
2009/04/17 PHP
PHP5.3与5.5废弃与过期函数整理汇总
2014/07/10 PHP
php使用Jpgraph创建折线图效果示例
2017/02/15 PHP
PHP dirname(__FILE__)原理及用法解析
2020/10/28 PHP
JQuery实现自定义对话框的代码
2008/06/15 Javascript
详解JavaScript对象和数组
2015/12/03 Javascript
jQuery Uploadify 上传插件出现Http Error 302 错误的解决办法
2015/12/12 Javascript
原生js实现百叶窗效果及原理介绍
2016/04/12 Javascript
JQuery解析XML数据的几个简单实例
2016/05/18 Javascript
js 获取元素所有兄弟节点的实现方法
2016/09/06 Javascript
js实现各种复制到剪贴板的方法(分享)
2016/10/27 Javascript
Node.js中process模块常用的属性和方法
2016/12/13 Javascript
关于Node.js的events.EventEmitter用法介绍
2017/04/01 Javascript
jQuery Form插件使用详解_动力节点Java学院整理
2017/07/17 jQuery
node.js 发布订阅模式的实例
2017/09/10 Javascript
javascript中undefined的本质解析
2019/07/31 Javascript
Flutter实现仿微信底部菜单栏功能
2019/09/18 Javascript
Python实现的二维码生成小软件
2014/07/11 Python
分析并输出Python代码依赖的库的实现代码
2015/08/09 Python
详解Python实现按任意键继续/退出的功能
2016/08/19 Python
Python数据拟合与广义线性回归算法学习
2017/12/22 Python
Django中使用Celery的方法示例
2018/11/29 Python
对python打乱数据集中X,y标签对的方法详解
2018/12/14 Python
Python爬虫设置代理IP(图文)
2018/12/23 Python
Python从入门到精通之环境搭建教程图解
2019/09/26 Python
python 二维矩阵转三维矩阵示例
2019/11/30 Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
2020/02/29 Python
python简单实现9宫格图片实例
2020/09/03 Python
html5 canvas实现圆形时钟代码分享
2013/12/25 HTML / CSS
会议活动邀请函
2014/01/27 职场文书
给全校老师的建议书
2014/03/13 职场文书
集团财务总监岗位职责
2015/04/03 职场文书
调任通知
2015/04/21 职场文书
傲慢与偏见读书笔记
2015/06/29 职场文书
Python实现简繁体转换
2021/06/07 Python
MySQL数据库完全卸载的方法
2022/03/03 MySQL