首页/新闻资讯/正文详情

正则回溯爆炸:一个表达式把 CPU 打满,3 步改写救回服务

发布时间:2026/9/24 13:44:23 来源:云帆数科 栏目:资讯中心
正则回溯爆炸:一个表达式把 CPU 打满,3 步改写救回服务
一个看起来逻辑正常的正则遇到恶意或异常长的输入可能从几毫秒变成几十秒直接把服务的 CPU 顶到 100%。这篇文章用本机跑出来的数据说明回溯爆炸是怎么发生的并给出 3 个能直接落地的修复方法。为什么说这是“隐蔽雷”正则引擎大多采用回溯backtracking来处理可选分支。Pattern 里出现一个“量词包量词”时引擎会在不同拆法之间反复试路径数随输入长度指数增长。最经典的坏味道是这个importre patternre.compile(r^(a)$)它想表达“整串都是 a”。但如果输入是aaaaaaaa...X结尾多一个不匹配的X(a)和外面这个就会把前面几十个a拆成无数种组合每一种都要推到结尾才发现失败。字符串长度每加 1尝试次数就接近翻一倍。复现同一段匹配耗时怎么涨我把下面这段在 Python 3.14 本机跑了一遍改变n观察耗时importre,timedefmatch_time(n:int):sa*nXttime.perf_counter()re.match(r^(a)$,s)returntime.perf_counter()-tfornin(20,22,24,26):print(n,round(match_time(n),4))a 的个数本机耗时秒200.0392220.1565240.6256262.5148每多 2 个字符耗时约变为 4 倍套成单字符就是约 2 倍。按这个趋势n30会到几十秒n36就会上千秒。像(a)$这类模式只要输入长度不受控就是线上定时炸弹。OWASP 等安全资料里把这类问题统称为 ReDoS。3 步改写救回服务第一步去掉嵌套量词回到单一匹配路径。同样的“整串都是 a”直接写成线性模式importre# 原来会指数回溯re.fullmatch(r(a),s)# 改后一次扫到尾re.fullmatch(ra,s)大多数 ReDoS 都能靠这步解决把(a)、([a-z])、(\d)这种“一个字符组加一层量词外面再套一层量词”改成一层。第二步能改写就改写改不了就限制输入长度。有些复杂 pattern 不能简化那就先卡住输入if len(text) 512: reject。安全资料里的建议也类似——不可信的输入在做复杂解析前先限长。宁可拒绝“过长”也别让一个请求把整台机器拖住。第三步给匹配加超时防住漏网之鱼。Python 标准库的re没有内置超时这也是 ReDoS 在 Python 服务里容易失控的原因。第三方regex包提供了timeout参数importregextry:regex.match(r^(a)$,bad_text,timeout1)exceptTimeoutError:# 1 秒没匹配完就当失败处理不再死等pass如果不想引入新依赖就把正则放进工作进程执行主进程设个超时把它干掉。核心思路都一样匹配可以被拒绝但服务不能被一个表达式按死。结果与下一步这一轮跑完得到三个能直接带走的结论^(a)$这类“量词包量词”是本机实测的指数坑n从 20 到 26耗时从 0.04 秒涨到 2.5 秒。优先去嵌套量词改写其次限制输入长度最后用 timeout 兜底。看到网上复制来的复杂正则先扫一眼有没有两层量词套同一个字符组。Podcast 里常听到“一个正则让服务挂了”真正落地处理时别只补小时段重启先查 pattern 本身是不是 ReDoS。把这三步写进 code review 检查项比自己记几个零散案例更省心。

相关推荐

distribution/reference:容器镜像引用(Reference)解析与规范化 Go 库全解析
distribution/reference:容器镜像引用(Reference)解析与规范化 Go 库全解析

云原生存储 【免费下载链接】distribution The toolkit to pack, ship, store, and deliver container content 项目地址: https://gitcode.com/gh_mirrors/dis/distribution 点击查看 免费下载 导读:本文围绕 distribution 项目 vendored 的 github.co… · 2026/9/24 13:44:23

背调合规在劳动用工决策边界上的证据要求
背调合规在劳动用工决策边界上的证据要求

背调信息能否进入劳动用工决策,不能只看信息是否被查到,也不能只凭候选人已经授权。较稳妥的边界是:先确认处理目的和合法性基础,再检验信息与岗位的直接关联、收集范围是否最小必要、结果是否经过准确性复核,最后由有… · 2026/9/24 13:44:10

310V转15V分立BUCK设计实战:高压差降压的工程解法
310V转15V分立BUCK设计实战:高压差降压的工程解法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 13:44:04

英专生的编程学习之路
英专生的编程学习之路

嗨大家好呀,欢迎来到我的第一篇博客。我是一名英语专业的大三学生。平时喜欢琢磨计算机相关知识,觉得计算机非常的神奇,希望能考研上岸计算机专硕。目前刚入门编程,基础不算扎实,但愿意沉下心持续练习,希望… · 2026/9/24 14:25:37

ESP32 WebSocket视频流实战:从摄像头到TFT屏的无线图像传输
ESP32 WebSocket视频流实战:从摄像头到TFT屏的无线图像传输

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 14:25:30

在 Fly.io 上自托管 Convex Backend:从零部署到生产环境的完整指南
在 Fly.io 上自托管 Convex Backend:从零部署到生产环境的完整指南

数据库后端 【免费下载链接】convex-backend The open-source reactive database for app developers 项目地址: https://gitcode.com/gh_mirrors/co/convex-backend 点击查看 免费下载 导读 本指南以仓库中 self-hosted/advanced/fly/README.md 为骨架&#xff0… · 2026/9/24 14:25:30

Comp AI CRM 国际化 SEO 审计指南:Hreflang、Canonical 与国际 Sitemap 的完整实战手册
Comp AI CRM 国际化 SEO 审计指南:Hreflang、Canonical 与国际 Sitemap 的完整实战手册

后端前端CRM人工智能AI Agent 【免费下载链接】crm Comp AI CRM is an open source, CRM designed for AI agents. Agentic-first CRM. 项目地址: https://gitcode.com/gh_mirrors/crm48/crm 点击查看 免费下载 本文以 Comp AI CRM 仓库内 seo-audit 技能的国际化 … · 2026/9/24 14:25:23

5 步搞定 OneNote 笔记备份,考研党快速找回 408 复习资料
5 步搞定 OneNote 笔记备份,考研党快速找回 408 复习资料

5 步搞定 OneNote 笔记备份,考研党快速找回 408 复习资料 【免费下载链接】cs-408 计算机考研专业课程408相关的复习经验,资源和OneNote笔记 项目地址: https://gitcode.com/GitHub_Trending/cs/cs-408 换了台新电脑登录 OneNote,同步… · 2026/9/24 14:25:23

把分散影视源装进一个遥控器:TVBoxOSC 电视盒子聚合播放框架
把分散影视源装进一个遥控器:TVBoxOSC 电视盒子聚合播放框架

把分散影视源装进一个遥控器:TVBoxOSC 电视盒子聚合播放框架 【免费下载链接】TVBoxOSC TVBoxOSC - 一个基于第三方项目的代码库,用于电视盒子的控制和管理。 项目地址: https://gitcode.com/GitHub_Trending/tv/TVBoxOSC 晚上十点,遥… · 2026/9/24 14:25:23

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码