浅谈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实现2014火车票查询代码分享
Jan 10 Python
利用Python画ROC曲线和AUC值计算
Sep 19 Python
Python面向对象程序设计之继承与多继承用法分析
Jul 13 Python
python实现换位加密算法的示例
Oct 14 Python
python 实现得到当前时间偏移day天后的日期方法
Dec 31 Python
Python3实现的反转单链表算法示例
Mar 08 Python
500行Python代码打造刷脸考勤系统
Jun 03 Python
python 中的列表生成式、生成器表达式、模块导入
Jun 19 Python
python tkinter库实现气泡屏保和锁屏
Jul 29 Python
PyCharm搭建Spark开发环境的实现步骤
Sep 05 Python
python支持多线程的爬虫实例
Dec 21 Python
Django全局启用登陆验证login_required的方法
Jun 02 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
php的计数器程序
2006/10/09 PHP
PHP异步调用socket实现代码
2012/01/12 PHP
自写的一个jQuery圆角插件
2010/10/26 Javascript
基于Jquery的标签智能验证实现代码
2010/12/27 Javascript
javascript获取flash版本号的方法
2014/11/20 Javascript
javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2015/04/01 Javascript
AngularJS的一些基本样式初窥
2015/07/27 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
2016/03/28 Javascript
AngularJS学习笔记(三)数据双向绑定的简单实例
2016/11/08 Javascript
Bootstrap基本样式学习笔记之标签(5)
2016/12/07 Javascript
使用node.js对音视频文件加密的实例代码
2017/08/30 Javascript
基于Vue2实现简易的省市区县三级联动组件效果
2018/11/05 Javascript
Vue.js标签页组件使用方法详解
2019/10/19 Javascript
uni-app 支持多端第三方地图定位的方法
2020/01/03 Javascript
python求素数示例分享
2014/02/16 Python
Python 出现错误TypeError: ‘NoneType’ object is not iterable解决办法
2017/01/12 Python
python中pandas.DataFrame排除特定行方法示例
2017/03/12 Python
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
Python3实现的判断回文链表算法示例
2019/03/08 Python
使用python获取(宜宾市地震信息)地震信息
2019/06/20 Python
对PyQt5中的菜单栏和工具栏实例详解
2019/06/20 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
python如何安装下载后的模块
2020/07/03 Python
多个版本的python共存时使用pip的正确做法
2020/10/26 Python
python温度转换华氏温度实现代码
2020/12/06 Python
Python3使用tesserocr识别字母数字验证码的实现
2021/01/29 Python
python快速安装OpenCV的步骤记录
2021/02/22 Python
国际领先的学术出版商:Springer
2017/01/11 全球购物
给交警的表扬信
2014/01/12 职场文书
力克胡哲观后感
2015/06/10 职场文书
2016年第16个全民国防教育日宣传活动总结
2016/04/05 职场文书
python3使用diagrams绘制架构图的步骤
2021/04/08 Python
「地球外少年少女」BD发售宣传CM公开
2022/03/21 日漫
Win11局域网共享权限在哪里设置? Win11高级共享的设置技巧
2022/04/05 数码科技
深入理解mysql事务隔离级别和存储引擎
2022/04/12 MySQL