PYTHON EVAL的用法及注意事项解析


Posted in Python onSeptember 06, 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(expression[, globals[, locals]])

强大吧,给个字符串给eval,eval给你一个表达式返回值。

globals : 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。expression : 字符串

locals : 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

结合globals和locals看看几个例子

传递globals参数值为{“age”:1822},

eval("{'name':'linux','age':age}",{"age":1822})

输出结果

eval("{'name':'linux','age':age}",{"age":1822}) 

再加上locals变量

eval("{'name':'linux','age':age}",{"age":1822},locals())

当两个参数都不为空时,先查找locals参数,再查找globals参数,locals参数中同名变量会覆盖globals中的变量。根据上面两个例子可以看到当locals参数为空,globals参数不为空时,查找globals参数中是否存在变量,并计算。

2、危险之处

eval虽然方便,但是要注意安全性,可以将字符串转成表达式并执行,就可以利用执行系统命令,删除文件等操作。

假设用户恶意输入。比如:

eval("__import__('os').system('ls /home/pythontab.com/www/')") 

那么eval()之后,你会发现,当前文件夹文件都会展如今用户前面。这句其实相当于执行了

os.system('ls /home/pythontab.com/www/')

那么继续输入:

eval("__import__('os').system('cat /home/pythontab.com/www/test.sql')")

代码都给人看了。

再来一条删除命令,文件消失。比如

eval("__import__('os').system('rm /home/pythontab.com/www/test.data')")

所以使用eval,一方面享受他的了灵活性同时,也要注意安全性。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中使用pyhook实现键盘监控的例子
Jul 18 Python
Python中的自定义函数学习笔记
Sep 23 Python
Python 冒泡,选择,插入排序使用实例
Feb 05 Python
在Python中操作文件之seek()方法的使用教程
May 24 Python
django admin添加数据自动记录user到表中的实现方法
Jan 05 Python
python使用response.read()接收json数据的实例
Dec 19 Python
python安装requests库的实例代码
Jun 25 Python
解决Python3 抓取微信账单信息问题
Jul 19 Python
在PyTorch中Tensor的查找和筛选例子
Aug 18 Python
Python的缺点和劣势分析
Nov 19 Python
Python项目跨域问题解决方案
Jun 22 Python
python中doctest库实例用法
Dec 31 Python
Python实现微信机器人的方法
Sep 06 #Python
Linux下通过python获取本机ip方法示例
Sep 06 #Python
django-crontab 定时执行任务方法的实现
Sep 06 #Python
Python使用matplotlib实现交换式图形显示功能示例
Sep 06 #Python
python自动发微信监控报警
Sep 06 #Python
Python使用Slider组件实现调整曲线参数功能示例
Sep 06 #Python
Python scipy的二维图像卷积运算与图像模糊处理操作示例
Sep 06 #Python
You might like
第二节 对象模型 [2]
2006/10/09 PHP
PHP 面向对象实现代码
2009/11/11 PHP
hadoop中一些常用的命令介绍
2013/06/19 PHP
PHP文件读写操作相关函数总结
2014/11/18 PHP
读jQuery之六 缓存数据功能介绍
2011/06/21 Javascript
javascript椭圆旋转相册实现代码
2012/01/16 Javascript
js冒泡、捕获事件及阻止冒泡方法详细总结
2014/05/08 Javascript
JS 使用for循环遍历子节点查找元素
2014/09/06 Javascript
javascript的函数作用域
2014/11/12 Javascript
Javascript动画的实现原理浅析
2015/03/02 Javascript
在浏览器中打开或关闭JavaScript的方法
2015/06/03 Javascript
简介JavaScript中Math.cos()余弦方法的使用
2015/06/15 Javascript
jqueryMobile 动态添加元素,展示刷新视图的实现方法
2016/05/28 Javascript
js 弹出虚拟键盘修改密码的简单实例
2016/10/10 Javascript
vue实现长图垂直居上 vue实现短图垂直居中
2017/10/18 Javascript
Vue2.0用户权限控制解决方案
2017/11/29 Javascript
vue 微信授权登录解决方案
2018/04/10 Javascript
解决vue项目运行npm run serve报错的问题
2020/10/26 Javascript
python多线程扫描端口示例
2014/01/16 Python
pycharm 使用心得(二)设置字体大小
2014/06/05 Python
详解Python中expandtabs()方法的使用
2015/05/18 Python
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
Python实现多进程共享数据的方法分析
2017/12/04 Python
pandas 两列时间相减换算为秒的方法
2018/04/20 Python
Python数据可视化:饼状图的实例讲解
2019/12/07 Python
详解CSS3实现响应式手风琴效果
2020/06/10 HTML / CSS
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
澳大利亚游乐场设备品牌:Lifespan Kids
2019/05/24 全球购物
在校生钳工实习自我鉴定
2013/09/19 职场文书
传播学专业毕业生自荐信
2013/11/04 职场文书
班级心理活动总结
2014/07/04 职场文书
大班上学期个人总结
2015/02/13 职场文书
2015年学生会个人工作总结
2015/04/09 职场文书
小学运动会通讯稿
2015/07/18 职场文书
涨工资申请书应该怎么写?
2019/07/08 职场文书
解决thinkphp6(tp6)在状态码500下不报错,或者显示错误“Malformed UTF-8 characters”的问题
2021/04/01 PHP