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数组的处理代码
Jan 04 Python
python多线程编程方式分析示例详解
Dec 06 Python
nginx搭建基于python的web环境的实现步骤
Jan 03 Python
Pandas —— resample()重采样和asfreq()频度转换方式
Feb 26 Python
Python类的动态绑定实现原理
Mar 21 Python
Python xml、字典、json、类四种数据类型如何实现互相转换
May 27 Python
python支持多继承吗
Jun 19 Python
Python使用eval函数执行动态标表达式过程详解
Oct 17 Python
python实战之用emoji表情生成文字
May 08 Python
如何理解及使用Python闭包
Jun 01 Python
Python实现随机生成迷宫并自动寻路
Jun 13 Python
python游戏开发之pygame实现接球小游戏
Apr 22 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
Symfony2学习笔记之控制器用法详解
2016/03/17 PHP
java模拟PHP的pack和unpack类
2016/04/13 PHP
PHP使用XMLWriter读写xml文件操作详解
2018/07/31 PHP
jQuery实用基础超详细介绍
2013/04/11 Javascript
详解jQuery插件开发中的extend方法
2013/11/19 Javascript
js生成缩略图后上传并利用canvas重绘
2014/05/15 Javascript
Bootstrap表单组件教程详解
2016/04/26 Javascript
js 中获取制定的cook信息实现方法
2016/11/19 Javascript
使用AngularJS2中的指令实现按钮的切换效果
2017/03/27 Javascript
Vue.js中extend选项和delimiters选项的比较
2017/07/17 Javascript
jQuery Ajax向服务端传递数组参数值的实例代码
2017/09/03 jQuery
JS实现的透明度渐变动画效果示例
2018/04/28 Javascript
vue生成token并保存到本地存储中
2018/07/17 Javascript
使用vue根据状态添加列表数据和删除列表数据的实例
2018/09/29 Javascript
layui添加动态菜单与选项卡
2019/07/26 Javascript
vue自定义指令和动态路由实现权限控制
2020/08/28 Javascript
微信小程序自定义支持图片的弹窗
2020/12/21 Javascript
[01:52]2014DOTA2西雅图邀请赛 V社开大会你不知道的小秘密
2014/07/08 DOTA
下载糗事百科的内容_python版
2008/12/07 Python
Python解析命令行读取参数--argparse模块使用方法
2018/01/23 Python
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
Python线性拟合实现函数与用法示例
2018/12/13 Python
Python中__repr__和__str__区别详解
2019/11/07 Python
Python sorted排序方法如何实现
2020/03/31 Python
哥伦比亚最大的网上商店:Linio哥伦比亚
2016/09/25 全球购物
生产班组长岗位职责
2014/01/05 职场文书
副董事长岗位职责
2014/04/02 职场文书
初中优秀班集体申报材料
2014/05/01 职场文书
会计专业毕业生自荐书
2014/06/25 职场文书
2015年安全生产月工作总结
2015/07/27 职场文书
新郎新娘致辞
2015/07/31 职场文书
2019年汽车租赁合同范本!
2019/08/12 职场文书
导游词之江苏溱潼古镇
2019/11/27 职场文书
python3使用diagrams绘制架构图的步骤
2021/04/08 Python
Django使用channels + websocket打造在线聊天室
2021/05/20 Python
HDFS免重启挂载新磁盘
2022/04/06 Servers