后缀检查不正确¶
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
indexOf
和 lastIndexOf
方法有时用于检查子字符串是否出现在字符串的特定位置。但是,如果返回的索引与可能计算为 -1 的表达式进行比较,则在某些情况下检查可能会通过,即使子字符串根本没有找到。
具体来说,这在使用 indexOf
实现 endsWith
时很容易发生。
建议¶
如果可用,请使用 String.prototype.endsWith
。否则,显式处理 -1 的情况,方法是检查字符串的相对长度,或者检查返回的索引是否为 -1。
示例¶
以下示例使用 lastIndexOf
来确定字符串 x
是否以字符串 y
结尾。
function endsWith(x, y) {
return x.lastIndexOf(y) === x.length - y.length;
}
但是,如果 y
比 x
长一个字符,则右侧 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;
}
参考¶
通用弱点枚举:CWE-20.