浅谈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之wxPython应用实例
Sep 28 Python
Python实现建立SSH连接的方法
Jun 03 Python
基于Python中单例模式的几种实现方式及优化详解
Jan 09 Python
python如何对实例属性进行类型检查
Mar 20 Python
python用户评论标签匹配的解决方法
May 31 Python
使用python对文件中的单词进行提取的方法示例
Dec 21 Python
Python 多个图同时在不同窗口显示的实现方法
Jul 07 Python
python调用webservice接口的实现
Jul 12 Python
python 如何将数据写入本地txt文本文件的实现方法
Sep 11 Python
Python实现word2Vec model过程解析
Dec 16 Python
Python基于requests实现模拟上传文件
Apr 21 Python
python实现数学模型(插值、拟合和微分方程)
Nov 13 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
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
2006/11/18 PHP
ecshop 订单确认中显示省市地址信息的方法
2010/03/15 PHP
PHP冒泡算法详解(递归实现)
2014/11/10 PHP
ExtJS扩展 垂直tabLayout实现代码
2009/06/21 Javascript
js获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
2013/05/21 Javascript
使用JS读秒使用示例
2013/09/21 Javascript
jquery动态改变div宽度和高度
2015/02/09 Javascript
jquery插件qrcode在线生成二维码
2015/04/26 Javascript
js实现文本框只允许输入数字并限制数字大小的方法
2015/08/19 Javascript
关于List.ToArray()方法的效率测试
2016/09/30 Javascript
Node.js包管理器Yarn的入门介绍与安装
2016/10/17 Javascript
js实现表单提交后不重新刷新当前页面
2016/11/30 Javascript
web打印小结
2017/01/11 Javascript
Node.js中用D3.js的方法示例
2017/01/16 Javascript
JS实现的全选、全不选及反选功能【案例】
2019/02/19 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
2019/03/25 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
JavaScript动态检测密码强度原理及实现方法详解
2019/06/11 Javascript
NestJs使用Mongoose对MongoDB操作的方法
2021/02/22 Javascript
python中遍历文件的3个方法
2014/09/02 Python
手动实现把python项目发布为exe可执行程序过程分享
2014/10/23 Python
Python多进程分块读取超大文件的方法
2016/04/13 Python
Python编程实现数学运算求一元二次方程的实根算法示例
2017/04/02 Python
tensorflow 打印内存中的变量方法
2018/07/30 Python
python提取xml里面的链接源码详解
2019/10/15 Python
python3 tkinter实现添加图片和文本
2019/11/26 Python
python生成特定分布数的实例
2019/12/05 Python
python 实现的IP 存活扫描脚本
2020/12/10 Python
欧洲最大的滑雪假期供应商之一:Sunweb Holidays
2018/01/06 全球购物
世界上最受欢迎的钓鱼诱饵:Rapala
2019/05/02 全球购物
高中语文教学反思
2014/01/16 职场文书
学生会主席竞聘书
2014/03/31 职场文书
入党积极分子批评与自我批评思想汇报
2014/09/14 职场文书
劳动仲裁调解书
2015/05/20 职场文书
机关干部正风肃纪心得体会
2016/01/15 职场文书
Docker官方工具docker-registry案例演示
2022/04/13 Servers