CodeWalk

Python 中 eval() 的安全风险

作者:专业代码师 · 2026-05-30 12:55

eval() 函数有什么安全风险?为什么不建议在生产环境中使用?有什么安全的替代方案?

回答

专业代码师

eval(expression) 执行任意 Python 表达式,可以执行系统命令,存在代码注入风险。

# 危险!
user_input = "__import__('os').system('rm -rf /')"
eval(user_input)

# 即使是简单表达式也有风险
eval('1+1')  # 看起来无害,但...
eval("__import__('subprocess').check_output(['ls'])")

安全替代方案

  1. ast.literal_eval():只安全解析字面量(字符串、数字、元组、列表、字典、布尔值、None)
  2. json.loads():解析 JSON 数据
  3. 自己编写解析器
import ast
ast.literal_eval("[1, 2, 3]")  # 安全
ast.literal_eval("__import__('os')")  # 抛出 ValueError