浅谈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下载FTP上的文件夹的实现代码
Feb 10 Python
用Python编写一个简单的Lisp解释器的教程
Apr 03 Python
简介Python设计模式中的代理模式与模板方法模式编程
Feb 02 Python
Django Admin实现上传图片校验功能
Mar 06 Python
python tkinter实现界面切换的示例代码
Jun 14 Python
python实现QQ批量登录功能
Jun 19 Python
python 实现12bit灰度图像映射到8bit显示的方法
Jul 08 Python
详解django实现自定义manage命令的扩展
Aug 13 Python
Python通过Pillow实现图片对比
Apr 29 Python
Python新手学习raise用法
Jun 03 Python
keras slice layer 层实现方式
Jun 11 Python
python实现简单文件读写函数
Feb 25 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中的float类型使用说明
2010/07/27 PHP
关于url地址传参数时字符串有回车造成页面脚本赋值失败的解决方法
2013/06/28 PHP
PHP中将ip地址转成十进制数的两种实用方法
2013/08/15 PHP
浅析php-fpm静态和动态执行方式的比较
2016/11/09 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
PHP封装请求类实例分析【基于Yii框架】
2019/10/17 PHP
JavaScript对象和字串之间的转换实例探讨
2013/04/21 Javascript
js通过八个点 拖动改变div大小的实现方法
2014/03/05 Javascript
jQuery中eq()方法用法实例
2015/01/05 Javascript
JavaScript中的函数模式详解
2015/02/11 Javascript
avalon js实现仿google plus图片多张拖动排序附源码下载
2015/09/24 Javascript
js轮播图代码分享
2016/07/14 Javascript
javascript的函数劫持浅析
2016/09/26 Javascript
React学习笔记之事件处理(二)
2017/07/02 Javascript
php register_shutdown_function函数详解
2017/07/23 Javascript
jQuery替换节点元素的操作方法
2018/03/18 jQuery
jQuery pjax 应用简单示例
2018/09/20 jQuery
JavaScript栈和队列相关操作与实现方法详解
2018/12/07 Javascript
jquery实现垂直手风琴导航栏
2020/02/18 jQuery
如何在vue 中引入使用jquery
2020/11/10 jQuery
python判断字符串是否纯数字的方法
2014/11/19 Python
TensorFlow损失函数专题详解
2018/04/26 Python
python创造虚拟环境方法总结
2019/03/04 Python
Pytorch模型转onnx模型实例
2020/01/15 Python
python+selenium 脚本实现每天自动登记的思路详解
2020/03/11 Python
python3安装OCR识别库tesserocr过程图解
2020/04/02 Python
中国最大的团购网站:聚划算
2016/09/21 全球购物
希尔顿酒店官方网站:Hilton Hotels
2017/06/01 全球购物
Wolford法国官网:奥地利奢侈内衣品牌
2020/08/11 全球购物
什么是Rollback Segment
2013/04/22 面试题
迟到检讨书400字
2014/01/13 职场文书
标准自荐信范文
2014/01/29 职场文书
活动倡议书范文
2014/05/13 职场文书
师范生见习总结范文
2015/06/23 职场文书
诚信高考倡议书
2019/06/24 职场文书
2019森林防火宣传标语大全!
2019/07/03 职场文书