浅谈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 WindowsError的错误代码详解
Jul 23 Python
Python pandas常用函数详解
Feb 07 Python
Python爬取数据并写入MySQL数据库的实例
Jun 21 Python
pandas去重复行并分类汇总的实现方法
Jan 29 Python
Python 函数返回值的示例代码
Mar 11 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
Mar 06 Python
Django跨域资源共享问题(推荐)
Mar 09 Python
python 制作python包,封装成可用模块教程
Jul 13 Python
Python基于xlutils修改表格内容过程解析
Jul 28 Python
Python3合并两个有序数组代码实例
Aug 11 Python
安装Anaconda3及使用Jupyter的方法
Oct 27 Python
pytorch实现线性回归以及多元回归
Apr 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的session cookie错误
2009/08/09 PHP
php图片处理函数获取类型及扩展名实例
2014/11/19 PHP
PHP实现函数内修改外部变量值的方法示例
2018/12/28 PHP
多浏览器兼容的获取元素和鼠标的位置的js代码
2009/12/15 Javascript
js面向对象 多种创建对象方法小结
2012/05/21 Javascript
js中事件的处理与浏览器对象示例介绍
2013/11/29 Javascript
window.location.href中url中数据量太大时的解决方法
2013/12/23 Javascript
jquery JSON的解析方式示例介绍
2014/07/27 Javascript
javascript框架设计读书笔记之模块加载系统
2014/12/02 Javascript
js给网页加上背景音乐及选择音效的方法
2015/03/03 Javascript
使用CoffeeScrip优美方式编写javascript代码
2015/10/28 Javascript
jquery mobile 移动web(5)
2015/12/20 Javascript
JavaScript中setTimeout和setInterval函数的传参及调用
2016/03/11 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合
2016/08/11 Javascript
JS获取及验证开始结束日期的方法
2016/08/20 Javascript
js鼠标跟随运动效果
2017/03/11 Javascript
vue中页面跳转拦截器的实现方法
2017/08/23 Javascript
100行代码实现一个vue分页组功能
2018/11/06 Javascript
[01:30:54]《加油DOTA》 第三期
2014/08/18 DOTA
python读取浮点数和读取文本文件示例
2014/05/06 Python
使用Python的web.py框架实现类似Django的ORM查询的教程
2015/05/02 Python
Python基础入门之seed()方法的使用
2015/05/15 Python
python 实现在Excel末尾增加新行
2018/05/02 Python
python如何查看微信消息撤回
2018/11/27 Python
在python中利用KNN实现对iris进行分类的方法
2018/12/11 Python
对python读取zip压缩文件里面的csv数据实例详解
2019/02/08 Python
Python序列类型的打包和解包实例
2019/12/21 Python
Django import export实现数据库导入导出方式
2020/04/03 Python
用CSS3绘制三角形的简单方法
2015/07/17 HTML / CSS
HTML中使用SVG与SVG预定义形状元素介绍
2013/06/28 HTML / CSS
Jones New York官网:美国女装品牌,受白领女性欢迎
2019/11/26 全球购物
一名毕业生的自我鉴定
2013/12/04 职场文书
企业厂长岗位职责
2013/12/17 职场文书
合伙经营协议书范本
2014/04/18 职场文书
公司人事专员岗位职责
2014/08/11 职场文书