浅谈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通过pil为png图片填充上背景颜色的方法
Mar 17 Python
Python中的高级函数map/reduce使用实例
Apr 13 Python
Python中字典创建、遍历、添加等实用操作技巧合集
Jun 02 Python
python不换行之end=与逗号的意思及用途
Nov 21 Python
python实现两个经纬度点之间的距离和方位角的方法
Jul 05 Python
python提取照片坐标信息的实例代码
Aug 14 Python
简单了解python中的f.b.u.r函数
Nov 02 Python
基于Python中isfile函数和isdir函数使用详解
Nov 29 Python
python 实现任务管理清单案例
Apr 25 Python
Python为何不支持switch语句原理详解
Oct 21 Python
Python编解码问题及文本文件处理方法详解
Jun 20 Python
Python PIL按比例裁剪图片
May 11 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 获取远程网页内容的代码(fopen,curl已测)
2011/06/06 PHP
PHP __autoload()方法真的影响性能吗?
2012/03/30 PHP
PHP+Mysql+Ajax+JS实现省市区三级联动
2014/05/23 PHP
php过滤HTML标签、属性等正则表达式汇总
2014/09/22 PHP
PHP-FPM实现性能优化
2016/03/31 PHP
PHP substr()函数参数解释及用法讲解
2017/11/23 PHP
js select常用操作控制代码
2010/03/16 Javascript
jQuery中live方法的重复绑定说明
2011/10/21 Javascript
js/jquery去掉空格,回车,换行示例代码
2013/11/05 Javascript
JS实现鼠标经过好友列表中的好友头像时显示资料卡的效果
2014/07/02 Javascript
javascript实现获取cookie过期时间的变通方法
2014/08/14 Javascript
JavaScript中switch判断容易犯错的一个细节
2014/08/27 Javascript
Node.js实现批量去除BOM文件头
2014/12/20 Javascript
不依赖Flash和任何JS库实现文本复制与剪切附源码下载
2015/10/09 Javascript
Js 获取当前函数参数对象的实现代码
2016/06/20 Javascript
webpack教程之webpack.config.js配置文件
2017/07/05 Javascript
bootstrap table实现iview固定列的效果实例代码详解
2019/09/30 Javascript
微信小程序中weui用法解析
2019/10/21 Javascript
JS如何判断对象是否包含某个属性
2020/08/29 Javascript
Python学习之Django的管理界面代码示例
2018/02/10 Python
对python 矩阵转置transpose的实例讲解
2018/04/17 Python
Python产生Gnuplot绘图数据的方法
2018/11/09 Python
Python3 jupyter notebook 服务器搭建过程
2018/11/30 Python
Python flask框架post接口调用示例
2019/07/03 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
2019/08/12 Python
python使用yaml 管理selenium元素的示例
2020/12/01 Python
HTML5+Canvas+CSS3实现齐天大圣孙悟空腾云驾雾效果
2016/04/26 HTML / CSS
Darphin迪梵官网: 来自巴黎,植物和精油调制的护肤品牌
2016/10/11 全球购物
日常奢侈品,轻松购物:Verishop
2019/08/20 全球购物
C#里面如何倒序排列一个数组的元素?
2013/06/21 面试题
英智兴达软件测试笔试题
2016/10/12 面试题
车辆安全检查制度
2014/01/12 职场文书
高一英语教学反思
2014/01/22 职场文书
市级青年文明号申报材料
2014/05/26 职场文书
学校党的群众路线教育实践活动对照检查材料
2014/09/24 职场文书
CSS3实现的侧滑菜单
2021/04/27 HTML / CSS