浅谈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常见文件操作的函数示例代码
Nov 15 Python
跨平台python异步回调机制实现和使用方法
Nov 26 Python
HTML中使用python屏蔽一些基本功能的方法
Jul 07 Python
opencv改变imshow窗口大小,窗口位置的方法
Apr 02 Python
Python运维之获取系统CPU信息的实现方法
Jun 11 Python
python 发送json数据操作实例分析
Oct 15 Python
Pytorch 多维数组运算过程的索引处理方式
Dec 27 Python
python实现QQ邮箱发送邮件
Mar 06 Python
Python3.7 读取音频根据文件名生成脚本的代码
Apr 07 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
Oct 18 Python
pytorch 实现在测试的时候启用dropout
May 27 Python
python中pymysql包操作数据库方法
Apr 19 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实现把数字ID转字母ID
2013/08/12 PHP
详解cookie验证的php应用的一种SSO解决办法
2017/10/20 PHP
PHP 中魔术常量的实例详解
2017/10/26 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
JavaScript 事件系统
2010/07/22 Javascript
jQuery验证Checkbox是否选中的代码 推荐
2011/09/04 Javascript
jQuery.Validate验证库的使用介绍
2013/04/26 Javascript
JS去除右边逗号的简单方法
2013/07/03 Javascript
JavaScript中的异常捕捉介绍
2014/12/31 Javascript
jquery获取多个checkbox的值异步提交给php
2015/07/07 Javascript
Node 自动化部署的方法
2017/10/17 Javascript
vue 组件的封装之基于axios的ajax请求方法
2018/08/11 Javascript
使用Node搭建reactSSR服务端渲染架构
2018/08/30 Javascript
在vue中读取本地Json文件的方法
2018/09/06 Javascript
js实现前面自动补全位数的方法
2018/10/10 Javascript
vue实现密码显示与隐藏按钮的自定义组件功能
2019/04/23 Javascript
Javascript 对象(object)合并操作实例分析
2019/07/30 Javascript
Angular封装表单控件及思想总结
2019/12/11 Javascript
Nodejs封装类似express框架的路由实例详解
2020/01/05 NodeJs
自动化Nginx服务器的反向代理的配置方法
2015/06/28 Python
Python操作mongodb的9个步骤
2018/06/04 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
2019/07/01 Python
Restful_framework视图组件代码实例解析
2020/11/17 Python
anello泰国官方网站:日本流行包包品牌
2019/08/08 全球购物
C语言中一个结构不能包含指向自己的指针吗
2012/05/25 面试题
如何清空Session
2015/02/23 面试题
自动化工程专业个人应聘自荐信
2013/09/26 职场文书
小学竞选班干部演讲稿
2014/08/20 职场文书
幼儿园辞职信
2015/05/13 职场文书
观后感格式
2015/06/19 职场文书
学校教师培训工作总结
2015/10/14 职场文书
七年级作文(600字3篇)
2019/09/24 职场文书
七年级作文之雪景
2019/11/18 职场文书
每日六道java新手入门面试题,通往自由的道路
2021/06/30 Java/Android
WCG2010 星际争霸决赛 Flash vs Goojila 1 星际经典比赛回顾
2022/04/01 星际争霸
在Docker容器中部署SQL Server
2022/04/11 Servers