掌握 Python 中 eval 函数:动态代码执行的工具与限制

🍀 前言

博客地址:

👋 简介

eval函数主要是用来实现python中各种数据类型与str之间的转换。字符串中包含的什么,通过eval函数就可以输出什么。比如字符串里面包含的字典就输出字典,包含的列表就输出列表,但是字符串相应的格式一定要输入正确,否则会报错。

📖 正文

1 eval函数介绍

1.1 函数的作用

计算指定表达式的值。也就是说它要执行的Python代码只能是单个运算表达式(注意eval不支持任意形式的赋值操作),而不能是复杂的代码逻辑,这一点和lambda表达式比较相似

1.2 函数定义

eval(expression, globals=None, locals=None)
参数:

  • expression:必选参数,可以是字符串,也可以是一个任意的code对象实例(可以通过compile函数创建)。如果它是一个字符串,它会被当作一个(使用globals和locals参数作为全局和本地命名空间的)Python表达式进行分析和解释。
  • globals:可选参数,表示全局命名空间(存放全局变量),如果被提供,则必须是一个字典对象。
  • locals:可选参数,表示当前局部命名空间(存放局部变量),如果被提供,可以是任何映射对象。如果该参数被忽略,那么它将会取与globals相同的值。
  • 如果globals与locals都被忽略,那么它们将取eval()函数被调用环境下的全局命名空间和局部命名空间。

2 eval函数应用

2.1 参数expression的使用
x = 10
y = 20
sum = eval('x + y')
print(sum)

# 30

eval函数的globals和locals参数都被忽略了,因此变量x和变量y都取得的是eval函数被调用环境下的作用域中的变量值,即:x = 10, y = 20,sum = x + y = 30

2.2 参数globals的使用
x = 10
y = 20
sum = eval('x + y', {'x': 1, 'y': 2})
print(sum)

# 3

eval函数只提供了globals参数而忽略了locals参数,因此locals会取globals参数的值,即:x = 1, y = 2,sum = x + y = 3

2.3 参数locals的使用
x = 10
y = 20
sum = eval('x + y', {'x': 1, 'y': 2}, {'y': 3, 'z': 4})
print(sum)

# 4

eval函数的globals参数和locals都被提供了,那么eval函数会先从全部作用域globals中找到变量x, 从局部作用域locals中找到变量y,即:x = 1, y = 3, sum = x + y = 4

2.4 返回值None
x = 10
y = 20
res = eval('print(x, y)')
print(res)

# 10 20
# None

因为print()函数不是一个计算表达式,没有计算结果,因此返回值为None

3 eval不适用的情况

eval虽然方便,但是要注意安全性,可以将字符串转成表达式并执行,就可以利用执行系统命令,删除文件等操作。

eval("__import__('os').system('ls /etc/docker')"

那么eval()执行后,当前文件夹文件都会展如今用户前面。这句其实相当于执行了以下代码

os.system('ls /etc/docker')

如果继续输入

eval("__import__('os').system('cat /xxxx/xxxx/cert.pem')")

那么秘密文件都给别人看到了,那么继续执行以下代码

eval("__import__('os').system('rm /xxxx/xxxx/cert.pem')")

重要文件都被删除了
所以,使用eval函数,还要注意安全性

✏ 总结

在Python程序中使用evel函数,不仅提供了很方便的操作,同时存在一定的安全风险,在使用过程中,需要避免风险发生。

💖 欢迎关注我的公众号

在这里插入图片描述

  • 32
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值