You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Snyk检测出的正则表达式ReDOS安全漏洞?

解决Snyk检测到的正则表达式安全漏洞

你的问题核心是这段动态拼接正则的代码存在正则注入风险,原手动转义的字符集不全,用_.escapeRegExp没解决大概率是用法不对或者没覆盖到问题点。

问题出在哪?

原代码手动转义的正则特殊字符遗漏了.、*等关键符号,而且动态拼接正则的方式本身就容易被Snyk标记为风险,哪怕你做了转义,也可能因为规则检测逻辑触发告警。

正确的修复方案

1. 正确用_.escapeRegExp + 按需保留捕获组

如果不需要捕获匹配内容,直接去掉外层括号,这样最安全:

const re = new RegExp(_.escapeRegExp(query), 'ig');

如果确实需要捕获组,确保转义后再拼接括号,同时可以给Snyk加忽略注释(仅在确认安全时用):

// snyk-ignore-reason: 已通过_.escapeRegExp完全转义所有正则特殊字符
const re = new RegExp(`(${_.escapeRegExp(query)})`, 'ig');

2. 原生实现完整的正则转义(不依赖lodash)

自己写转义函数,覆盖所有正则特殊字符,比原代码的转义更全面:

function escapeRegExp(str) {
  // 转义所有正则元字符:.*+?^${}()|[]\
  return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

const re = new RegExp(`(${escapeRegExp(query)})`, 'ig');
// 不需要捕获组就写成:new RegExp(escapeRegExp(query), 'ig');

3. 为什么之前用_.escapeRegExp没生效?

大概率是你没替换掉原有的手动转义逻辑,导致重复转义出问题;或者Snyk的规则对动态拼接的正则默认告警,需要加注释明确说明已做安全处理。

测试验证

拿带特殊字符的query测试,比如query = "user.*(admin)",转义后应该变成user\.\*\(admin\),此时正则会匹配字面量字符串,不会被解析为正则语法,彻底避免注入风险。

内容的提问来源于stack exchange,提问作者Zik 3r

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 05:22:42