过于宽松的正则表达式范围¶
ID: js/overly-large-range
Kind: problem
Security severity: 5.0
Severity: warning
Precision: high
Tags:
- correctness
- security
- external/cwe/cwe-020
Query suites:
- javascript-code-scanning.qls
- javascript-security-extended.qls
- javascript-security-and-quality.qls
编写匹配比预期更广泛的字符范围的正则表达式很容易。例如,/[a-zA-z]/
匹配所有小写字母和所有大写字母,正如预期的那样,但它也匹配以下字符:[ \ ] ^ _ `
。
另一个常见的问题是未能转义正则表达式中的连字符。未转义的连字符被解释为范围的一部分。例如,在字符类 [a-zA-Z0-9%=.,-_]
中,最后一个字符范围匹配从 ,
到 _
(包括两者)之间的 55 个字符,这与范围 [0-9]
重叠,显然不是编写者想要的。
建议¶
通过编写明确的正则表达式来避免对哪些字符包含在范围内的任何混淆。始终检查字符范围是否仅匹配预期字符。
示例¶
以下示例代码旨在检查字符串是否为有效的 6 位十六进制颜色。
function isValidHexColor(color) {
return /^#[0-9a-fA-f]{6}$/i.test(color);
}
但是,A-f
范围过于宽泛,它匹配所有大写字母。它会将像 #XXYYZZ
这样的“颜色”解析为有效。
解决方法是使用大写 A-F
范围。
function isValidHexColor(color) {
return /^#[0-9A-F]{6}$/i.test(color);
}
参考文献¶
GitHub 安全漏洞数据库:CVE-2021-42740:在 shell-quote 中,对命令中使用的特殊元素的清理不当
wh0.github.io:利用 CVE-2021-42740
Yosuke Ota:no-obscure-range
Paul Boyd:The regex [,-.]
常见弱点枚举:CWE-20.