浅谈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写的服务监控程序实例
Jan 31 Python
Python中类型检查的详细介绍
Feb 13 Python
Python Selenium Cookie 绕过验证码实现登录示例代码
Apr 10 Python
python 批量修改/替换数据的实例
Jul 25 Python
使用django的ORM框架按月统计近一年内的数据方法
Jul 18 Python
使用pyecharts生成Echarts网页的实例
Aug 12 Python
Python面向对象封装操作案例详解 II
Jan 02 Python
python 实现任务管理清单案例
Apr 25 Python
Python中关于logging模块的学习笔记
Jun 03 Python
python 读txt文件,按‘,’分割每行数据操作
Jul 05 Python
Python如何获取文件路径/目录
Sep 22 Python
Python selenium绕过webdriver监测执行javascript
Apr 12 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
phpMyAdmin链接MySql错误 个人解决方案
2009/12/28 PHP
通过JAVAScript实现页面自适应
2007/01/19 Javascript
js 方法实现返回多个数据的代码
2009/04/30 Javascript
用户注册常用javascript代码
2009/08/29 Javascript
关于Javascript与iframe的那些事儿
2013/07/04 Javascript
JS实现随机数生成算法示例代码
2013/08/08 Javascript
Javascript原型链和原型的一个误区
2014/10/22 Javascript
AngularJs 指令详解及示例代码
2016/09/01 Javascript
移动端脚本框架Hammer.js
2016/12/15 Javascript
jquery获取select,option所有的value和text的实例
2017/03/06 Javascript
requirejs + vue 项目搭建详解
2017/06/16 Javascript
ES7中利用Await减少回调嵌套的方法详解
2017/11/01 Javascript
基于vue实现网站前台的权限管理(前后端分离实践)
2018/01/13 Javascript
JS实现获取word文档内容并输出显示到html页面示例
2018/06/23 Javascript
详解swiper在vue中的应用(以3.0为例)
2018/09/20 Javascript
微信端调取相册和摄像头功能,实现图片上传,并上传到服务器
2019/05/16 Javascript
Javascript类型判断相关例题及解析
2020/08/26 Javascript
[01:06:43]完美世界DOTA2联赛PWL S3 PXG vs GXR 第二场 12.19
2020/12/24 DOTA
在漏洞利用Python代码真的很爽
2007/08/26 Python
Python单元测试框架unittest简明使用实例
2015/04/13 Python
Python安装使用命令行交互模块pexpect的基础教程
2016/05/12 Python
使用Python脚本实现批量网站存活检测遇到问题及解决方法
2016/10/11 Python
python多进程中的内存复制(实例讲解)
2018/01/05 Python
Python使用LDAP做用户认证的方法
2019/06/20 Python
解决Python spyder显示不全df列和行的问题
2020/04/20 Python
TensorFlow使用Graph的基本操作的实现
2020/04/22 Python
python爬虫破解字体加密案例详解
2021/03/02 Python
美国著名的团购网站:Woot
2016/08/02 全球购物
美国第一个网上卖鞋零售商:OnlineShoes.com
2017/09/24 全球购物
会计电算化专业个人的自我评价
2013/11/24 职场文书
2015年宣传部工作总结范文
2015/03/31 职场文书
2015年社区流动人口工作总结
2015/05/12 职场文书
经费申请报告范文
2015/05/18 职场文书
三好学生主要事迹材料
2015/11/03 职场文书
2019年年中职场激励人心语录30条
2019/08/07 职场文书
python开发的自动化运维工具ansible详解
2021/08/07 Python