如何解决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
相关产品推荐
相关产品推荐

