浅谈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 18 Python
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
Jan 19 Python
11个并不被常用但对开发非常有帮助的Python库
Mar 31 Python
python基于BeautifulSoup实现抓取网页指定内容的方法
Jul 09 Python
Python2和Python3中print的用法示例总结
Oct 25 Python
numpy中的delete删除数组整行和整列的实例
May 09 Python
对python中的 os.mkdir和os.mkdirs详解
Oct 16 Python
selenium跳过webdriver检测并模拟登录淘宝
Jun 12 Python
numpy中三维数组中加入元素后的位置详解
Nov 28 Python
利用pandas将非数值数据转换成数值的方式
Dec 18 Python
解决Django响应JsonResponse返回json格式数据报错问题
Aug 09 Python
baselines示例程序train_cartpole.py的ImportError
May 20 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
source.php查看源文件
2006/12/09 PHP
PHP会员找回密码功能的简单实现
2016/09/05 PHP
javascript Base类 包含基本的方法
2009/07/22 Javascript
使用javascript获取flash加载的百分比的实现代码
2011/05/25 Javascript
javascript实现的DES加密示例
2013/10/30 Javascript
$(document).ready(function() {})不执行初始化脚本
2014/06/19 Javascript
Jquery设置attr的disabled属性控制某行显示或者隐藏
2014/09/25 Javascript
使用jspdf生成pdf报表
2015/07/03 Javascript
jQuery支持添加事件的日历特效代码分享(3种样式)
2015/08/24 Javascript
Angular 根据 service 的状态更新 directive
2016/04/03 Javascript
什么是JavaScript注入攻击?
2016/09/14 Javascript
node.js版本管理工具n无效的原理和解决方法
2016/11/24 Javascript
vue.js实现备忘录demo
2019/06/26 Javascript
[01:45:05]VGJ.T vs Newbee Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
window下eclipse安装python插件教程
2017/04/24 Python
python实现批量图片格式转换
2020/06/16 Python
浅谈Python_Openpyxl使用(最全总结)
2019/09/05 Python
python实现宿舍管理系统
2019/11/22 Python
150行python代码实现贪吃蛇游戏
2020/04/24 Python
django为Form生成的label标签添加class方式
2020/05/20 Python
Pytorch 卷积中的 Input Shape用法
2020/06/29 Python
Python类class参数self原理解析
2020/11/19 Python
python制作抽奖程序代码详解
2021/01/15 Python
Html5新标签datalist实现输入框与后台数据库数据的动态匹配
2017/05/18 HTML / CSS
游戏商店:Eneba
2020/04/25 全球购物
十岁生日父母答谢词
2014/01/18 职场文书
2014年应届大学生毕业自我鉴定
2014/01/31 职场文书
护理毕业生自我鉴定
2014/02/11 职场文书
空中乘务员岗位职责
2014/03/08 职场文书
单位承诺书格式
2014/05/21 职场文书
新闻工作者先进事迹
2014/05/26 职场文书
2015年五四青年节活动总结
2015/02/10 职场文书
加薪通知
2015/04/25 职场文书
pytorch fine-tune 预训练的模型操作
2021/06/03 Python
Python制作一个随机抽奖小工具的实现
2021/07/07 Python
Java实现二分搜索树的示例代码
2022/03/17 Java/Android