正则表达式始终匹配¶
ID: js/regex/always-matches
Kind: problem
Security severity:
Severity: warning
Precision: high
Tags:
- correctness
- regular-expressions
Query suites:
- javascript-security-and-quality.qls
JavaScript 中有几个内置函数可以在字符串中搜索正则表达式匹配,例如 RegExp.prototype.test
和 String.prototype.search
。如果正则表达式没有锚点,它只需要匹配输入字符串的子字符串,不一定匹配整个字符串。
如果要搜索的正则表达式接受空字符串,则意味着它可以在输入字符串的任何位置匹配空子字符串,因此始终可以找到匹配项。在这种情况下,测试匹配项是否存在是多余的,并且表明存在死代码。
建议¶
检查正则表达式并确定其预期匹配方式
要匹配整个输入字符串,请在正则表达式的开头和结尾添加锚点。
要搜索输入字符串中的某个出现,请考虑最短的有效匹配是什么,并相应地限制正则表达式,例如将
*
更改为+
。
示例¶
在以下示例中,使用正则表达式检查字符串 id
的格式。但是,检查始终通过,因为正则表达式可以匹配空子字符串。例如,它将允许 ID 字符串“%%
”,方法是在索引 0 处匹配空字符串。
if (!/[a-z0-9]*/.test(id)) {
throw new Error("Invalid id: " + id);
}
要确保正则表达式匹配整个字符串,请在开头和结尾添加锚点
if (!/^[a-z0-9]*$/.test(id)) {
throw new Error("Invalid id: " + id);
}
参考¶
Mozilla 开发者网络:JavaScript 正则表达式.