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 相关文章推荐
Python3基础之输入和输出实例分析
Aug 18 Python
Python中的生成器和yield详细介绍
Jan 09 Python
Python模块搜索路径代码详解
Jan 29 Python
Python命令行解析模块详解
Feb 01 Python
详解配置Django的Celery异步之路踩坑
Nov 25 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
Nov 29 Python
Python帮你微信头像任意添加装饰别再@微信官方了
Sep 25 Python
Pytorch释放显存占用方式
Jan 13 Python
将pytorch转成longtensor的简单方法
Feb 18 Python
Python单例模式的四种创建方式实例解析
Mar 04 Python
python录音并调用百度语音识别接口的示例
Dec 01 Python
python机器学习实现oneR算法(以鸢尾data为例)
Mar 03 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
现磨咖啡骗局!现磨咖啡=新鲜咖啡?现磨咖啡背后的猫腻你不懂!
2019/03/28 冲泡冲煮
PHP编程之高级技巧——利用Mysql函数
2006/10/09 PHP
一个显示某段时间内每个月的方法 返回由这些月份组成的数组
2012/05/16 PHP
VIM中设置php自动缩进为4个空格的方法详解
2013/06/14 PHP
PHP获取MSN好友列表类的实现代码
2013/06/23 PHP
php实现短信发送代码
2015/07/05 PHP
php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
2016/11/10 PHP
PHP使用Http Post请求发送Json对象数据代码解析
2020/07/16 PHP
浅析JavaScript 调试方法和技巧
2015/10/22 Javascript
全面了解javascript三元运算符
2016/06/27 Javascript
使用bootstrap实现多窗口和拖动效果
2016/09/22 Javascript
jquery.Callbacks的实现详解
2016/11/30 Javascript
jQuery实现的两种简单弹窗效果示例
2018/04/18 jQuery
PHP读取远程txt文档到数组并实现遍历
2020/08/25 Javascript
Vue使用screenfull实现全屏效果
2020/09/17 Javascript
一篇文章让你搞懂JavaScript 原型和原型链
2020/11/23 Javascript
Python中使用PIL库实现图片高斯模糊实例
2015/02/08 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
PyCharm+Qt Designer+PyUIC安装配置教程详解
2019/06/13 Python
Python列表(list)所有元素的同一操作解析
2019/08/01 Python
基于python及pytorch中乘法的使用详解
2019/12/27 Python
python torch.utils.data.DataLoader使用方法
2020/04/02 Python
jupyter 中文乱码设置编码格式 避免控制台输出的解决
2020/04/20 Python
Python使用eval函数执行动态标表达式过程详解
2020/10/17 Python
python 发送邮件的四种方法汇总
2020/12/02 Python
IE矩阵Matrix滤镜旋转与缩放及如何结合transform
2012/11/29 HTML / CSS
挂牌仪式主持词
2014/03/20 职场文书
教师一岗双责责任书
2014/04/16 职场文书
2015年党性分析材料
2014/12/19 职场文书
一年级数学下册复习计划
2015/01/17 职场文书
搞笑老公保证书
2015/02/26 职场文书
员工拾金不昧表扬稿
2015/05/05 职场文书
2016年度员工工作表现评语
2015/12/02 职场文书
关于vue中如何监听数组变化
2021/04/28 Vue.js
pytorch 使用半精度模型部署的操作
2021/05/24 Python
MySQL中几种插入和批量语句实例详解
2021/09/14 MySQL