当前位置: 首页 > 图灵资讯 > 行业资讯> Python中的eval用法及注意事项

Python中的eval用法及注意事项

来源:图灵python
时间: 2025-03-07 22:08:13

eval是Python的内置函数,其功能是返回传入字符串的表达式结果。想象变量赋值时,将等号右侧的表达式写入

在字符串的格式中,这个字符串作为eval的参数,eval的返回值就是这个表达式的结果。

eval函数在python中的使用非常灵活,但也非常危险,安全性是其缺点。本文从灵活性和危险性两个方面介绍了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给你一个表达式返回值。

eval的语法格式如下:

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

expression : 字符串

globals : 变量作用域,整体命名空间,如果提供,必须是字典对象。

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

结合globals和locals看几个例子

Globals参数值的传输{age”:1822},

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

输出结果

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

再加上locals变量

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怎么爬取js请求

下一篇:

返回列表