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类型定义

热门 新品 本地