Python eval函数详解:语法、应用与安全风险防范

沈亦白
沈亦白
发布时间:2026-10-13 | 2人浏览过
原创

本文深入解析Python内置函数eval的用法,涵盖字符串转列表、字典等数据类型的灵活应用,以及globals和locals参数的作用机制。重点剖析eval执行恶意代码的风险,如通过__import__调用系统命令导致文件泄露或删改,并提供安全使用建议,帮助开发者在享受便利的同时规避潜在安全隐患。

Python eval函数详解:语法、应用与安全风险防范

前言

eval是Python语言中的一个内置函数,其核心功能是计算并返回传入字符串表达式的结果。可以将其理解为将变量赋值时等号右侧的表达式以字符串形式呈现,并将该字符串作为eval函数的参数传入,最终eval会返回该表达式计算后的值。

在Python中,eval函数的使用方式非常灵活,但同时也伴随着较高的安全风险,安全性问题是其最大的短板。本文将从灵活性与危险性两个维度对eval函数进行详细介绍。

eval函数的强大之处与数据类型转换

1、强大之处

通过几个具体示例来感受eval在数据类型转换方面的能力,特别是字符串与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传入一个字符串,它即可返回对应的表达式结果。

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参数中查找是否存在相关变量并进行计算。

eval函数的安全风险与恶意代码防范

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 相关产品和应用

全部下载

专题列表