2020-12-21 13:37:02
Python 中的 eval() 是一个内置函数,用于将字符串作为 Python 表达式动态执行并返回结果。以下是详细说明:
核心功能动态代码执行从外部源(如用户输入、配置文件)读取字符串并执行:
user_input = "len('hello')"print(eval(user_input)) # 输出 5动态查询构建在 SQL 或 NoSQL 中插入变量(需谨慎处理输入以避免注入攻击):
table = "users"condition = "age > 18"query = f"SELECT * FROM {table} WHERE {condition}"# 实际场景中应使用参数化查询替代序列化/反序列化将字符串还原为对象(但更推荐使用 json 或 pickle 模块):
serialized = "[1, 2, 3]"obj = eval(serialized) # 返回列表 [1, 2, 3]代码注入漏洞:eval() 会执行任意代码,若字符串来自不可信来源(如用户输入),可能导致恶意操作:
eval("os.system('rm -rf /')") # 极端危险!限制措施:
使用 ast.literal_eval() 替代,它仅支持字面量(如列表、字典、数字等),不执行函数或变量。
通过 globals 和 locals 参数限制命名空间:eval("x + y", {"x": 1, "y": 2}) # 仅允许访问指定变量
无法执行语句:eval() 仅处理表达式,不能执行赋值、if 等语句(会引发 SyntaxError):
eval("x = 10") # 错误!需改用 exec()ast.literal_eval()安全地解析字符串为 Python 字面量:
import astast.literal_eval("[1, 2, 3]") # 返回列表exec()执行代码块(如多行语句):
exec("for i in range(3): print(i)")专用解析工具如 json.loads() 处理 JSON 字符串,避免直接使用 eval()。