浅谈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中字典的基本知识初步介绍
May 21 Python
linux查找当前python解释器的位置方法
Feb 20 Python
python opencv 简单阈值算法的实现
Aug 04 Python
解决Pytorch 训练与测试时爆显存(out of memory)的问题
Aug 20 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
Aug 22 Python
django重新生成数据库中的某张表方法
Aug 28 Python
python批量处理文件或文件夹
Jul 28 Python
Django连接数据库并实现读写分离过程解析
Nov 13 Python
简单了解Python3 bytes和str类型的区别和联系
Dec 19 Python
Pytorch实现LSTM和GRU示例
Jan 14 Python
Python闭包装饰器使用方法汇总
Jun 29 Python
解决pytorch 数据类型报错的问题
Mar 03 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
从Web查询数据库之PHP与MySQL篇
2009/09/25 PHP
thinkphp模板输出技巧汇总
2014/11/24 PHP
php查询ip所在地的方法
2014/12/05 PHP
php array_keys 返回数组的键名
2016/10/25 PHP
Yii2下session跨域名共存的解决方案
2017/02/04 PHP
Laravel使用支付宝进行支付的示例代码
2017/08/16 PHP
浅谈Laravel核心解读之Console内核
2018/12/02 PHP
js中数组Array的一些常用方法总结
2013/08/12 Javascript
浅析JavaScript中的同名标识符优先级
2013/12/06 Javascript
javascript实现数字验证码的简单实例
2014/02/10 Javascript
jQuery分别获取选中的复选框值的示例
2014/06/17 Javascript
jQuery构造函数init参数分析
2015/05/13 Javascript
jQuery Validate初步体验(一)
2015/12/12 Javascript
基于Vue2的移动端开发环境搭建详解
2016/11/03 Javascript
javascript中的try catch异常捕获机制用法分析
2016/12/14 Javascript
JS瀑布流实现方法实例分析
2016/12/19 Javascript
Bootstrap Table使用整理(三)
2017/06/09 Javascript
Vue 2中ref属性的使用方法及注意事项
2017/06/12 Javascript
WebPack配置vue多页面的技巧
2018/05/15 Javascript
js限制input只能输入有效的数字(第一个不能是小数点)
2018/09/28 Javascript
浅谈JavaScript中this的指向更改
2020/07/28 Javascript
Python 根据日志级别打印不同颜色的日志的方法示例
2019/08/08 Python
Python 下载及安装详细步骤
2019/11/04 Python
在Pytorch中计算自己模型的FLOPs方式
2019/12/30 Python
python多线程使用方法实例详解
2019/12/30 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
2020/07/28 Python
Bally美国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/18 全球购物
简述你对Statement,PreparedStatement,CallableStatement的理解
2013/03/25 面试题
连锁经营管理专业大学生求职信
2013/10/30 职场文书
机关财务管理制度
2014/01/17 职场文书
生产厂长岗位职责
2014/02/21 职场文书
通用自荐信范文
2014/03/14 职场文书
超市店庆活动方案
2014/08/31 职场文书
小学六年级班主任工作经验交流材料
2015/11/02 职场文书
JavaScript 实现页面滚动动画
2021/04/24 Javascript
Html5同时支持多端sdk的小技巧
2021/11/17 HTML / CSS