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 相关文章推荐
推荐11个实用Python库
Jan 23 Python
Python复制目录结构脚本代码分享
Mar 06 Python
wxpython中自定义事件的实现与使用方法分析
Jul 21 Python
详解Python的Lambda函数与排序
Oct 25 Python
Python数据结构与算法之图结构(Graph)实例分析
Sep 05 Python
python出现"IndentationError: unexpected indent"错误解决办法
Oct 15 Python
python使用pil库实现图片合成实例代码
Jan 20 Python
浅谈Python 列表字典赋值的陷阱
Jan 20 Python
python3对接mysql数据库实例详解
Apr 30 Python
python3.6使用tkinter实现弹跳小球游戏
May 09 Python
基于python实现操作redis及消息队列
Aug 27 Python
python实现粒子群算法
Oct 15 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
web方式ftp
2006/10/09 PHP
PHP imagecreatefrombmp 从BMP文件或URL新建一图像
2012/07/16 PHP
php程序员应具有的7种能力小结
2014/11/27 PHP
php简单获取复选框值的方法
2016/05/11 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
一些常用的JS功能函数(2009-06-04更新)
2009/06/04 Javascript
MooTools 1.2中的Drag.Move来实现拖放
2009/09/15 Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
2016/06/12 Javascript
JavaScript DOM节点操作方法总结
2016/08/23 Javascript
微信小程序 SocketIO 实例讲解
2016/10/13 Javascript
String字符串截取的四种方式总结
2016/11/28 Javascript
bootstrap警告框示例代码分享
2017/05/17 Javascript
bootstrap daterangepicker汉化以及扩展功能
2017/06/15 Javascript
js实现多张图片延迟加载效果
2017/07/17 Javascript
详解jQuery中的easyui
2018/09/02 jQuery
JS实现动态添加外部js、css到head标签的方法
2019/06/05 Javascript
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
2019/09/10 jQuery
js模拟实现烟花特效
2020/03/10 Javascript
详解 Python中LEGB和闭包及装饰器
2017/08/03 Python
pandas的object对象转时间对象的方法
2018/04/11 Python
Python实现简单http服务器
2018/04/12 Python
Python函数返回不定数量的值方法
2019/01/22 Python
python安装scipy的步骤解析
2019/09/28 Python
python如何把字符串类型list转换成list
2020/02/18 Python
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
涂鸦板简单实现 Html5编写属于自己的画画板
2016/07/05 HTML / CSS
优秀经理事迹材料
2014/02/01 职场文书
学习演讲稿范文
2014/05/10 职场文书
工地标语大全
2014/06/18 职场文书
2014教师教育实践活动对照检查材料思想汇报
2014/09/21 职场文书
2014年应急工作总结
2014/12/11 职场文书
先进教师事迹材料
2014/12/16 职场文书
表扬稿范文
2015/01/17 职场文书
政协工作总结2015
2015/05/20 职场文书
工作感言一句话
2015/08/01 职场文书