开发者实战2026-09-15
正则表达式避坑指南:灾难性回溯(ReDoS)原理与高频规则全集
AIJSON 质量保障组· 12 分钟阅读· 3780 次阅读
导读摘要: 剖析非确定性有限状态自动机(NFA)正则引擎在复杂模式匹配下导致 CPU 100% 拒绝服务的灾难性回溯机理,提供工业级防御规范,并附录中国身份证、手机号、密码强度与统一社会信用代码等 20+ 精选高频正则。
1. 一行不起眼的正则,如何让整台服务器瘫痪?#
在 2019 年,著名的 CDN 服务商 Cloudflare 曾发生过一起全球范围的重大服务中断故障,波及包括 Discord、Shopify 在内的数百万网站。 事故的根本原因,仅仅是因为其核心防火墙引擎中更新了一条包含“灾难性回溯”的正则表达式。
这条看似普通的正则在面对恶意构造成的畸形字符串时,导致底层 JavaScript/V8 引擎的 CPU 占用率瞬间拉满至 100%,耗尽了服务器所有核心资源。这种利用正则表达式缺陷发起的拒绝服务攻击被称为 ReDoS (Regular Expression Denial of Service)。
2. 灾难性回溯的底层物理成因(NFA 引擎爆炸)#
主流编程语言(JavaScript, Python, Java, PHP, Go)的正则实现大都基于 NFA(Non-deterministic Finite Automaton)引擎。 NFA 的核心特性是贪婪匹配与回溯机制。
看一个经典的危险正则示例:
当输入合法的regex^(a+)+$
aaaa 时,匹配只需几步;
但当输入为 aaaaaaaaaaaaaaaaaaaaaaaaaaaaX(末尾有一个不匹配的字符)时:
a+ 与外部量词 (...)+ 之间存在重叠交集;3. 防范 ReDoS 的三大工程法则#
(a+)+、([a-z]+)、.+. 这类模式;RegexMatchTimeout);4. 生产环境 20+ 高频常用正则表达式精选清单#
regex^1(3\d|4[5-9]|5[0-35-9]|6[56]|7[0-8]|8\d|9[0-35-9])\d{8}$
regex^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$
regex^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$
regex^(?=.[a-z])(?=.[A-Z])(?=.\d)(?=.[@$!%?&])[A-Za-z\d@$!%?&]{8,20}$