0

0

Python 如何安全地执行用户输入的表达式(不要用 eval)

冷漠man

冷漠man

发布时间:2026-01-24 18:02:02

|

675人浏览过

|

来源于php中文网

原创

不能用 eval 执行用户输入,因其会直接执行任意代码、无沙箱限制;应优先用 ast.literal_eval 处理安全字面量,必要时用 simpleeval 或自定义 ast 遍历限制运算符和节点。

python 如何安全地执行用户输入的表达式(不要用 eval)

为什么不能用 eval 执行用户输入

eval 会直接在当前作用域执行任意 Python 代码,哪怕只是传入 "__import__('os').system('rm -rf /')" 这样的字符串,也可能触发系统调用、文件操作或网络请求。它不区分“表达式”和“语句”,也不限制内置函数访问,本质上不是沙箱——只是把字符串当代码扔进解释器里跑一遍。

真实场景中,用户可能故意输入 "2 + (lambda: exec('print(1)'))()" 绕过简单关键词过滤;或者利用 getattr__builtins__ 等反射机制逃逸限制。靠字符串黑名单/白名单基本防不住。

ast.literal_eval 处理安全子集

ast.literal_eval 只允许基础字面量:数字、字符串、元组、列表、字典、布尔值、None。它不会执行函数调用、属性访问、运算符重载,也不会触发任何副作用。

  • 适合场景:解析用户提交的配置项、JSON-like 参数(如 "[1, 2, {'x': 3.14}]"
  • 不支持:变量名、算术运算("2 + 3")、比较("5 > 3")、函数调用("len([1,2])"
  • 错误类型:输入非法时抛出 ValueErrorSyntaxError,不是 Exception 的宽泛捕获

示例:

立即学习Python免费学习笔记(深入)”;

免费语音克隆
免费语音克隆

这是一个提供免费语音克隆服务的平台,用户只需上传或录制一段 5 秒以上的清晰语音样本,平台即可生成与用户声音高度一致的 AI 语音克隆。

下载
import ast
try:
    result = ast.literal_eval("[1, 2, {'a': True}]")
except (ValueError, SyntaxError) as e:
    # 安全失败,无副作用
    print("Invalid literal:", e)

需要计算表达式?用 simpleeval 或自定义 AST 遍历

如果必须支持 "2 * x + 1" 这类带变量和运算的表达式,ast.literal_eval 不够用,但又不想自己从头写解析器,推荐轻量库 simpleeval

  • 默认禁用所有函数和属性访问,只开放基础运算符和常量
  • 可安全注入变量:se.eval("a + b", names={"a": 10, "b": 20})
  • 能限制最大执行步数、嵌套深度、字符串长度,防止穷举或溢出
  • 不支持 lambdaimportexec、下标以外的属性访问(如 obj.method

不用第三方库时,可基于 ast.Expression + 白名单节点遍历实现最小计算器,重点拦截 ast.Callast.Attributeast.Subscript(除非明确允许数组索引)等危险节点。

绕过沙箱的常见手法与应对

即使用了 simpleeval 或自定义 AST,也要警惕用户构造边缘输入:

  • "1 if True else __import__('sys').exit()" → 检查是否允许条件表达式,或禁用 ast.IfExp
  • "'a' * 10**6" → 限制字符串生成长度,或在遍历时统计总字符估算量
  • "[i for i in range(10**6)]" → 禁用列表推导式(ast.ListComp),或限制循环模拟次数
  • 利用大整数幂运算耗尽 CPU:9**9**5 → 在访客节点时检查数字大小和运算符组合

真正安全的表达式求值没有银弹。越接近通用计算能力,防御成本越高。多数业务场景其实只需要 ast.literal_eval 或固定几个运算符的白名单——先想清楚“用户到底需要算什么”,再决定沙箱复杂度。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

455

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

334

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

18

2026.02.03

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1566

2023.10.24

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1566

2023.10.24

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号