未绑定反向引用¶
ID: js/regex/unbound-back-reference
Kind: problem
Security severity:
Severity: warning
Precision: very-high
Tags:
- reliability
- correctness
- regular-expressions
Query suites:
- javascript-security-and-quality.qls
在正则表达式中,反向引用可以用于引用之前匹配的捕获组的结果。ECMAScript 标准禁止使用“\n”形式的反向引用,其中“n”是大于正则表达式中捕获组数量的正数。
虽然许多浏览器允许此类引用,并将它们解释为普通字符转义,但这是一种非标准行为,不应该依赖于它。如果正则表达式稍后发生更改,它也可能成为错误的来源,因为字符转义可能会开始匹配新引入的捕获组。
建议¶
如果反向引用用于引用捕获组,请确保存在具有正确数量的捕获组。如果它用于转义序列,请将其转换为十六进制字符转义,这与 ECMAScript 兼容。
示例¶
在以下示例中,反向引用\1
可能用于引用组(?:\s+)
匹配的字符串。但是,该组是非捕获组。
/^(?:\s+)\w+\1$/;
要解决此问题,请将组转换为捕获组(\s+)
。
如果\1
实际上用于匹配字符代码为 1 的字符,则应将其重写为十六进制字符转义\x01
。
参考¶
Ecma 国际,《ECMAScript 语言规范》,第 5.1 版,第 15 节。ECMA,2011 年。
Mozilla 开发者网络:JavaScript 正则表达式.