浅谈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 基础学习教程
Feb 08 Python
Python实现批量将word转html并将html内容发布至网站的方法
Jul 14 Python
Python加密方法小结【md5,base64,sha1】
Jul 13 Python
Python基于Matplotlib库简单绘制折线图的方法示例
Aug 14 Python
Python实现输出程序执行进度百分比的方法
Sep 16 Python
详谈pandas中agg函数和apply函数的区别
Apr 20 Python
pycharm访问mysql数据库的方法步骤
Jun 18 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
Dec 18 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
Jan 18 Python
Python数据可视化实现漏斗图过程图解
Jul 20 Python
python制作抽奖程序代码详解
Jan 15 Python
python之PySide2安装使用及QT Designer UI设计案例教程
Jul 26 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
收集的DedeCMS一些使用经验
2007/03/17 PHP
ThinkPHP查询中的魔术方法简述
2014/06/25 PHP
thinkPHP多语言切换设置方法详解
2016/11/11 PHP
Alliance vs AM BO3 第二场2.13
2021/03/10 DOTA
使用dynatrace-ajax跟踪JavaScript的性能
2010/04/12 Javascript
js网页侧边随页面滚动广告效果实现
2011/04/14 Javascript
用Javascript实现Windows任务管理器的代码
2012/03/27 Javascript
jQuery方法简洁实现隔行换色及toggleClass的使用
2013/03/15 Javascript
提示$ is not defined错误分析及解决
2013/04/09 Javascript
jQuery-ui引入后Vs2008的无智能提示问题解决方法
2014/02/10 Javascript
浅谈javascript对象模型和function对象
2014/12/26 Javascript
JavaScript队列、优先队列与循环队列
2016/11/14 Javascript
bootstrap输入框组件使用方法详解
2017/01/19 Javascript
详解Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
2017/02/11 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
2017/08/19 Javascript
浅谈Angular路由守卫
2017/08/26 Javascript
Windows下Node.js安装及环境配置方法
2017/09/18 Javascript
深入浅析ES6 Class 中的 super 关键字
2017/10/20 Javascript
Vue不能观察到数组length的变化
2018/06/08 Javascript
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
Python利用BeautifulSoup解析Html的方法示例
2017/07/30 Python
Python爬虫实例扒取2345天气预报
2018/03/04 Python
Python中使用logging和traceback模块记录日志和跟踪异常
2019/04/09 Python
微信公众号token验证失败解决方案
2019/07/22 Python
Python时间序列缺失值的处理方法(日期缺失填充)
2019/08/11 Python
Python实现在线批量美颜功能过程解析
2020/06/10 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
2020/10/31 Python
python用opencv 图像傅里叶变换
2021/01/04 Python
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
母亲80寿诞答谢词
2014/01/16 职场文书
员工拓展培训方案
2014/02/15 职场文书
《夏夜多美》教学反思
2014/02/17 职场文书
党的群众路线对照检查材料思想汇报(学校)
2014/10/04 职场文书
交通安全月活动总结
2015/05/08 职场文书
解决Django transaction进行事务管理踩过的坑
2021/04/24 Python
Window server中安装Redis的超详细教程
2021/11/17 Redis