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网页请求urllib2模块简单封装代码
Feb 07 Python
Python实现的二维码生成小软件
Jul 11 Python
Python利用多进程将大量数据放入有限内存的教程
Apr 01 Python
Python计算已经过去多少个周末的方法
Jul 25 Python
Python中文竖排显示的方法
Jul 28 Python
使用tensorflow实现线性回归
Sep 08 Python
python代理工具mitmproxy使用指南
Jul 04 Python
ipad上运行python的方法步骤
Oct 12 Python
Python合并2个字典成1个新字典的方法(9种)
Dec 19 Python
Python和Anaconda和Pycharm安装教程图文详解
Feb 04 Python
利用django创建一个简易的博客网站的示例
Sep 29 Python
Python-OpenCV教程之图像的位运算详解
Jun 21 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
用php+mysql一个名片库程序
2006/10/09 PHP
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
2013/07/03 PHP
PHP开发框架laravel安装与配置教程
2015/03/13 PHP
php版微信支付api.mch.weixin.qq.com域名解析慢原因与解决方法
2016/10/12 PHP
php strftime函数的详细用法
2018/06/21 PHP
JS Array对象入门分析
2008/10/30 Javascript
js中将HTMLCollection/NodeList/伪数组转换成数组的代码
2011/07/31 Javascript
JavaScript去除数组里重复值的方法
2015/07/13 Javascript
Javascript控制div属性动态变化实例分析
2015/10/08 Javascript
js中的面向对象入门
2017/03/06 Javascript
实例分析js事件循环机制
2017/12/13 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
2020/05/09 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
[10:18]2018DOTA2国际邀请赛寻真——Fnatic能否笑到最后?
2018/08/14 DOTA
Python实现抓取城市的PM2.5浓度和排名
2015/03/19 Python
全面了解Python环境配置及项目建立
2016/06/30 Python
利用Python实现网络测试的脚本分享
2017/05/26 Python
python使用正则表达式来获取文件名的前缀方法
2018/10/21 Python
实时获取Python的print输出流方法
2019/01/07 Python
python正则表达式的懒惰匹配和贪婪匹配说明
2020/07/13 Python
Python如何读写二进制数组数据
2020/08/01 Python
如何基于Python pygame实现动画跑马灯
2020/11/18 Python
python 实现的车牌识别项目
2021/01/25 Python
如何配置、使用和清除Smarty缓存
2015/12/23 面试题
什么是Connection-oriented Protocol/Connectionless Protocol面向连接的协议/无连接协议
2012/09/06 面试题
门卫岗位职责
2013/11/15 职场文书
工厂门卫岗位职责
2013/11/25 职场文书
优秀党支部事迹材料
2014/01/14 职场文书
学习十八大报告感言
2014/02/04 职场文书
运动会广播稿20字
2014/02/18 职场文书
平面设计求职信
2014/03/10 职场文书
班级心理活动总结
2014/07/04 职场文书
摄影专业毕业生求职信
2014/08/05 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
生日寿星公答谢词
2015/09/29 职场文书
vue2实现provide inject传递响应式
2021/05/21 Vue.js