CodeQL 文档

后缀检查不正确

ID: js/incorrect-suffix-check
Kind: problem
Security severity: 7.8
Severity: error
Precision: high
Tags:
   - security
   - correctness
   - external/cwe/cwe-020
Query suites:
   - javascript-code-scanning.qls
   - javascript-security-extended.qls
   - javascript-security-and-quality.qls

单击以查看 CodeQL 存储库中的查询

indexOflastIndexOf 方法有时用于检查子字符串是否出现在字符串的特定位置。但是,如果返回的索引与可能计算为 -1 的表达式进行比较,则在某些情况下检查可能会通过,即使子字符串根本没有找到。

具体来说,这在使用 indexOf 实现 endsWith 时很容易发生。

建议

如果可用,请使用 String.prototype.endsWith。否则,显式处理 -1 的情况,方法是检查字符串的相对长度,或者检查返回的索引是否为 -1。

示例

以下示例使用 lastIndexOf 来确定字符串 x 是否以字符串 y 结尾。

function endsWith(x, y) {
  return x.lastIndexOf(y) === x.length - y.length;
}

但是,如果 yx 长一个字符,则右侧 x.length - y.length 变为 -1,然后等于 lastIndexOf 的返回值。这将使测试通过,即使 x 并不以 y 结尾。

为避免这种情况,请显式检查 -1 的情况。

function endsWith(x, y) {
  let index = x.lastIndexOf(y);
  return index !== -1 && index === x.length - y.length;
}

参考

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