CodeQL 文档

正则表达式始终匹配

ID: js/regex/always-matches
Kind: problem
Security severity: 
Severity: warning
Precision: high
Tags:
   - correctness
   - regular-expressions
Query suites:
   - javascript-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

JavaScript 中有几个内置函数可以在字符串中搜索正则表达式匹配,例如 RegExp.prototype.testString.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);
}

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私