ReDoS风险检测器
静态启发式分析正则表达式的灾难性回溯风险
粘贴正则表达式(支持 /pattern/flags 形式),自动检测嵌套量词、可重叠分支、大边界重复、相邻可变片段四类 ReDoS 高危模式,给出风险等级、命中片段、原因解释与修复建议。纯静态分析,不会用长文本实际执行你的正则。
正则表达式
支持 /pattern/flags 形式(g i m s u y),也支持裸 pattern;输入后实时分析
检测规则说明
- • 嵌套量词:量词直接套在内部已含量词的分组上,如 (a+)+、(a*)*b,回溯呈指数级
- • 重叠分支:量词作用在可匹配相同输入的分支上,如 (a|aa)+,产生大量等价回溯路径
- • 大边界重复:{1,9999} 这类超大边界,展开后中间状态极多,嵌套时更危险
- • 相邻可变片段:多段可变长度片段(\d+\w* 类)相邻,边界归属不唯一,回溯为多项式级
输入正则表达式后,这里会显示风险分析结果
#什么是ReDoS灾难性回溯
ReDoS(Regular Expression Denial of Service,正则拒绝服务)是一种特殊的资源耗尽攻击:正则表达式本身逻辑正确,但面对特定输入时,回溯型引擎会尝试指数级数量的匹配路径,一次匹配从毫秒级膨胀到数小时甚至数天,进程被这一个请求拖死。2019 年 Cloudflare 的全球宕机事件,起因就是一条上线九年的正则在新规则触发下发生了灾难性回溯。
经典案例:(a+)+$
用 (a+)+$ 去匹配 30 个 a 加一个感叹号(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!):由于结尾的感叹号永远无法匹配,引擎会不断尝试把前面的 a 重新划分给内外两层量词——每一层都有「取多少个 a」的 free choice,路径总数约为 2 的 30 次方。这就是嵌套量词 (a+)+、(a*)*b、(a|aa)+ 被称为「正则地雷」的原因:模式合法、测试通过,只在恶意输入时引爆。
防御手段
- 评审正则时重点检查嵌套量词与重叠分支,本工具的四条启发式规则即来源于此
- 无法改写时,用排除字符类把「循环+切分」重构为「一次线性匹配」,如 (a+)+$ 处理无空白场景可改写为 [^\s]*$
- 新版 JavaScript 引擎支持原子组 (?>…) 与占有量词 a++、a*+,可直接消除内层回溯;旧环境则应重构模式
- 对用户输入的长度设上限,给正则匹配加超时(如 re2、rust regex 等无回溯引擎天然免疫)
常见问题
- 会执行我的正则吗?只用 new RegExp 做一次语法编译校验,不会将其运行于任何文本,更不会构造恶意输入。
- 没有命中就一定安全吗?不是。启发式只能覆盖已知模式形态,复杂正则建议结合真实数据压测与超时保护。
相关工具推荐
Spine动画编辑器
专业的Spine动画预览和编辑工具,支持多引擎导出
SQL查询优化器
分析SQL查询并提供优化建议
JVM启动参数配置
可视化配置Java虚拟机启动参数,支持内存、GC、性能等选项
代码片段转换
不同编程语言间代码片段转换(如Python↔JavaScript)
IP地址查询
查询IP地址的地理位置、运营商、ASN等信息,支持IPv4和IPv6
JSON转TypeScript接口
根据JSON数据自动生成TypeScript类型定义