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中的两个内置模块介绍
Apr 05 Python
Python中常用操作字符串的函数与方法总结
Feb 04 Python
python中的break、continue、exit()、pass全面解析
Aug 05 Python
漂亮的Django Markdown富文本app插件的实现
Jan 02 Python
深入解析Python小白学习【操作列表】
Mar 23 Python
python实现KNN分类算法
Oct 16 Python
python manage.py runserver流程解析
Nov 08 Python
python中matplotlib实现随鼠标滑动自动标注代码
Apr 23 Python
浅谈python 调用open()打开文件时路径出错的原因
Jun 05 Python
Django QuerySet查询集原理及代码实例
Jun 13 Python
python中数字是否为可变类型
Jul 08 Python
使用python求解迷宫问题的三种实现方法
Mar 17 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中,文件上传
2006/12/06 PHP
用来解析.htpasswd文件的PHP类
2012/09/05 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
2014/10/15 PHP
浅谈PHP检查数组中是否存在某个值 in_array 函数
2016/06/13 PHP
php json转换相关知识(小结)
2018/12/21 PHP
理解Javascript_05_原型继承原理
2010/10/13 Javascript
jquery实现点击弹出层效果的简单实例
2014/03/03 Javascript
Javascript基础知识(三)BOM,DOM总结
2014/09/29 Javascript
浅谈JavaScript对象与继承
2016/07/10 Javascript
javascript 解决浏览器不支持的问题
2016/09/24 Javascript
vue实现点击展开点击收起效果
2018/04/27 Javascript
layui框架table 数据表格的方法级渲染详解
2018/08/19 Javascript
JS中实现浅拷贝和深拷贝的代码详解
2019/06/05 Javascript
vue分页器组件编写方法详解
2019/06/28 Javascript
bootstrap-paginator服务器端分页使用方法详解
2020/02/13 Javascript
[03:20]次级联赛厮杀超职业 现超级兵对拆世纪大战
2014/10/30 DOTA
在Heroku云平台上部署Python的Django框架的教程
2015/04/20 Python
利用Python在一个文件的头部插入数据的实例
2018/05/02 Python
解决pip install xxx报错SyntaxError: invalid syntax的问题
2018/11/30 Python
详解Python学习之安装pandas
2019/04/16 Python
Python3基础教程之递归函数简单示例
2019/06/07 Python
使用Python制作表情包实现换脸功能
2019/07/19 Python
python numpy中cumsum的用法详解
2019/10/17 Python
基于python代码批量处理图片resize
2020/06/04 Python
python 实用工具状态机transitions
2020/11/21 Python
意大利专业化妆品品牌:KIKO MILANO
2017/02/01 全球购物
中国高端鲜花第一品牌:roseonly(一生只送一人)
2017/02/12 全球购物
商场促销活动方案
2014/02/08 职场文书
老同学聚会感言
2014/02/23 职场文书
节能减耗标语
2014/06/21 职场文书
2014年社区教育工作总结
2014/12/02 职场文书
《丑小鸭》教学反思
2016/02/19 职场文书
你离财务总监还有多远?速览CFO的岗位职责
2019/11/18 职场文书
PHP判断是否是json字符串
2021/04/01 PHP
python scipy 稀疏矩阵的使用说明
2021/05/26 Python
Android实现图片九宫格
2022/06/28 Java/Android