URL路径及查询参数正则优化:修复多项式正则ReDoS警告
正则优化方案
原有正则触发ReDoS告警、允许连续斜杠的核心原因是使用了嵌套可变量词结构((\/)[\dA-Za-z-]+)*,这种外层*套内层+的写法在匹配长异常字符串时,回溯次数会随输入长度暴涨,属于代码扫描重点拦截的多项式正则写法;再加上市面路径和查询参数的匹配边界不清晰,字符组存在重叠匹配空间,进一步放大了回溯风险。
优化后可直接使用的正则
/^\/(?:[\da-zA-Z-]+\/)*[\da-zA-Z-]*\/?(?:\?[&\da-zA-Z=-]*)?$/
逻辑说明
这个写法完全覆盖所有校验规则,同时从结构上消灭了回溯风险:
- 开头强制匹配
/,直接拦截不以斜杠开头的非法链接 - 路径部分用
(?:[\da-zA-Z-]+\/)*匹配多段路径,严格要求每段路径内容(仅允许字母、数字、短横线)后面才能跟斜杠,从根本上杜绝连续斜杠的问题 - 支持最后一级路径为空、或者末尾带斜杠的场景,覆盖根路径
/、路径以/结尾的合法情况 - 查询参数部分固定以
?作为和路径的分割边界,和路径部分完全独立,不存在匹配重叠,后面仅允许参数需要的&、=、字母、数字、短横线,不会拦截合法的键值对参数 - 所有量词没有嵌套重复结构,匹配过程是线性的,不会产生指数级回溯,不会触发ReDoS告警
测试用例验证结果
- 合法场景全部通过:
/、/section、/section/article-1、/section/article-1/、/section/article-1?x=y&hello=world均可正常匹配 - 非法场景全部拦截:非斜杠开头的
section/article-1、带特殊字符的/section/!$*、带括号的/x(1)、带连续斜杠的//section均会匹配失败
内容的提问来源于stack exchange,提问作者Drkawashima
相关产品推荐
相关产品推荐

