首页 > 编程语言 >Python eval的用法及注意事项

Python eval的用法及注意事项

时间:2023-11-01 15:31:35浏览次数:28  
标签:__ Python age globals eval 注意事项 字符串 locals

eval是Python的一个内置函数,这个函数的作用是,返回传入字符串的表达式的结果。想象一下变量赋值时,将等号右边的表达式写成字符串的格式,将这个字符串作为eval的参数,eval的返回值就是这个表达式的结果。

python中eval函数的用法十分的灵活,但也十分危险,安全性是其最大的缺点。本文从灵活性和危险性两方面介绍eval。

1、强大之处

举几个例子感受一下,字符串与list、tuple、dict的转化。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16


= "[[1,2], [3,4], [5,6], [7,8], [9,0]]"

= eval(a)

b

Out[3]: [[12], [34], [56], [78], [90]]

type(b)

Out[4]: list

= "{1: 'a', 2: 'b'}"

= eval(a)

b

Out[7]: {1'a'2'b'}

type(b)

Out[8]: dict

= "([1,2], [3,4], [5,6], [7,8], (9,0))"

= eval(a)

b

Out[11]: ([12], [34], [56], [78], (90))


强大吧,给个字符串给eval,eval给你一个表达式返回值。

eval的语法格式如下:

1


eval(expression[, globals[, locals]])


expression : 字符串

globals : 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。

locals : 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

结合globals和locals看看几个例子

传递globals参数值为{“age”:1822},

1


eval("{'name':'linux','age':age}",{"age":1822})


输出结果

1


{‘name': ‘linux', ‘age': 1822}


再加上locals变量

1

2


age=18

eval("{'name':'linux','age':age}",{"age":1822},locals())


根据上面两个例子可以看到当locals参数为空,globals参数不为空时,查找globals参数中是否存在变量,并计算。

当两个参数都不为空时,先查找locals参数,再查找globals参数,locals参数中同名变量会覆盖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,age,globals,eval,注意事项,字符串,locals
From: https://blog.51cto.com/u_16191847/8125230

相关文章

  • python 模块导入赋值给变量
    一、假设有一个dangerous_code.py文件。二、导入模块赋值给变量dangerous_module=__import__('dangerous_code')三、执行模块中的delete_all函数(方法)删除内容danderous_module.delete_all()免责声明:本号所涉及内容仅供安全研究与教学使用,如出现其他风险,后果......
  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-24-处理单选和多选按钮-上篇
    1.简介在工作和生活中,经常会遇到我们需要进行选择的情况,比如勾选我们选择性别,男女两个性别总是不能同时选中的,再比如我们在选择兴趣爱好时,我们可以选择多个自己感兴趣的话题,比如:篮球、足球、电竞等话题。我们在执行自动化测试的过程中,必须要学会处理这样的情况。在实际自动化测试......
  • Python使用got库如何写一个爬虫代码?
    got库是一个Python的HTTP库,可以用于爬取网页数据。它提供了简单易用的API,支持异步请求和爬虫IP设置等功能。使用got库进行爬虫开发,可以快速地获取所需数据。下面是使用got库进行爬虫的基本步骤:1、安装got库:可以使用pip命令进行安装,命令为pipinstallgot。2、导入got库:在Python代码......
  • 通过python批量调整图片的大小
    在日常工作或学习中,我们经常需要对图片进行大小调整。如果只有一两张图片,我们可以直接使用一些常见的图像处理软件(如Photoshop)来完成。但是,如果有大量图片需要调整大小,手动操作显然效率低下。这时,我们可以借助Python的PIL库来实现批量调整图片大小的功能。本文将介绍如何使用P......
  • python + flask + ffmpeg + hls.js
    参考视频链接:https://www.bilibili.com/video/BV1ay4y1A78j/?p=5&spm_id_from=pageDriver&vd_source=5fed6e8a7e3ad9f10860bf7a4540ba71......
  • Python 潮流周刊#15:如何分析 FastAPI 异步请求的性能?
    你好,我是猫哥。这里每周分享优质的Python、AI及通用技术内容,大部分为英文。标题取自其中一则分享,不代表全部内容都是该主题,特此声明。本周刊精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进......
  • Python用PyMC3贝叶斯模型平均BMA:采样、信息准则比较和预测可视化灵长类动物的乳汁成分
    当面对多个模型时,我们有多种选择。模型选择因其简单性而具有吸引力,但我们正在丢弃有关模型中不确定性的信息。  print(f"Runing模型平均一种替代方法是执行模型选择,但讨论所有不同的模型以及给定信息准则的计算值。重要的是要将所有这些数字和测试放在我们问题的背景下,以便我们和......
  • Python用PyMC贝叶斯GLM广义线性模型、NUTS采样器拟合、后验分布可视化
    尽管贝叶斯方法相对于频率主义方法的理论优势已经在其他地方进行了详细讨论,但其更广泛采用的主要障碍是“可用性”。而使用贝叶斯方法,客户可以按照自己认为合适的方式定义模型。线性回归在此示例中,我们将帮助客户从最简单的GLM–线性回归开始。一般来说,频率论者对线性回归的看......
  • 21.13 Python 实现端口流量转发
    端口流量转发(PortForwarding)是一种网络通信技术,用于将特定的网络流量从一个端口或网络地址转发到另一个端口或地址。它在网络中扮演着一个非常重要的角色,在Python语言中实现端口转发非常容易。如下这段代码实现了一个基本的TCP端口映射,将本地指定端口的流量转发到指定的远程IP和......
  • Python学习笔记(一)蒙特卡罗算法求圆周率π
    绪论\(\pi\)(圆周率)是数学和物理学普遍存在的常数之一,可以被定义为圆周长和直径之比或者圆的面积与半径平方之比(\(l=2\pir\)和\(S=\pir^2\))。\(\pi\)是一个无理数,下面将用蒙特卡罗算法求\(\pi\)的数值近似。要求1.要求能算到小数点后面越多越好‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫......