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写的贪吃蛇游戏例子
Jun 16 Python
Python实现partial改变方法默认参数
Aug 18 Python
Python中json格式数据的编码与解码方法详解
Jul 01 Python
基于python(urlparse)模板的使用方法总结
Oct 13 Python
python实现最长公共子序列
May 22 Python
Numpy array数据的增、删、改、查实例
Jun 04 Python
Python实现调用另一个路径下py文件中的函数方法总结
Jun 07 Python
Django 中自定义 Admin 样式与功能的实现方法
Jul 04 Python
opencv实现简单人脸识别
Feb 19 Python
python config文件的读写操作示例
Sep 27 Python
python3中rank函数的用法
Nov 27 Python
pd.DataFrame中的几种索引变换的实现
Jun 16 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
用Flash图形化数据(二)
2006/10/09 PHP
Drupal读取Excel并导入数据库实例
2014/03/02 PHP
php数组编码转换示例详解
2014/03/11 PHP
php中curl使用指南
2015/02/05 PHP
php实现通用的信用卡验证类
2015/03/24 PHP
php实现网页端验证码功能
2017/07/11 PHP
实例分析10个PHP常见安全问题
2019/07/09 PHP
Js放到HTML文件中的哪个位置有什么区别
2013/08/21 Javascript
引用 js在IE与FF之间的区别详细解析
2013/11/20 Javascript
JS动态增加删除UL节点LI及相关内容示例
2014/05/21 Javascript
javascript实现在下拉列表中显示多级树形菜单的方法
2015/08/12 Javascript
JS函数定义方式的区别介绍
2016/03/22 Javascript
Javascript基础学习笔记(菜鸟必看篇)
2016/07/22 Javascript
nodejs中模块定义实例详解
2017/03/18 NodeJs
JQuery实现图片轮播效果
2017/05/08 jQuery
element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
2019/01/15 Javascript
使用vue for时为什么要key【推荐】
2019/07/11 Javascript
Node Mongoose用法详解【Mongoose使用、Schema、对象、model文档等】
2020/05/13 Javascript
jQuery 添加元素和删除元素的方法
2020/07/15 jQuery
Element InputNumber计数器的使用方法
2020/07/27 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
2020/09/18 Javascript
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
Python程序员鲜为人知但你应该知道的17个问题
2014/06/04 Python
使用Python监控文件内容变化代码实例
2018/06/04 Python
Python集中化管理平台Ansible介绍与YAML简介
2019/06/12 Python
Python如何计算语句执行时间
2019/11/22 Python
python 解决tqdm模块不能单行显示的问题
2020/02/19 Python
python 两种方法删除空文件夹
2020/09/29 Python
canvas 基础之图像处理的使用
2020/04/10 HTML / CSS
ziaja齐叶雅官方海外旗舰店:来自波兰的天然护肤品牌
2017/01/02 全球购物
小学中秋节活动方案
2014/02/06 职场文书
无房证明范本
2014/09/17 职场文书
初中化学教学反思
2016/02/22 职场文书
Python数据分析入门之数据读取与存储
2021/05/13 Python
阿里云服务器部署mongodb的详细过程
2021/09/04 MongoDB
图文详解Nginx版本平滑升级方案
2021/09/15 Servers