过于宽泛的正则表达式范围¶
ID: java/overly-large-range
Kind: problem
Security severity: 5.0
Severity: warning
Precision: high
Tags:
- correctness
- security
- external/cwe/cwe-020
Query suites:
- java-code-scanning.qls
- java-security-extended.qls
- java-security-and-quality.qls
很容易编写一个正则表达式范围,它匹配的字符范围比你预期的更广。例如,/[a-zA-z]/
匹配所有小写和所有大写字母,正如你所期望的,但它也匹配字符:[ \ ] ^ _ `
。
另一个常见问题是未能转义正则表达式中的破折号字符。未转义的破折号被解释为范围的一部分。例如,在字符类 [a-zA-Z0-9%=.,-_]
中,最后一个字符范围匹配 ,
和 _
(包括两者)之间的 55 个字符,这与范围 [0-9]
重叠,显然不是编写者预期的。
建议¶
通过编写明确的正则表达式,避免对范围中包含哪些字符产生任何混淆。始终检查字符范围是否仅匹配预期字符。
示例¶
以下示例代码旨在检查字符串是否为有效的 6 位十六进制颜色。
import java.util.regex.Pattern
public class Tester {
public static boolean is_valid_hex_color(String color) {
return Pattern.matches("#[0-9a-fA-f]{6}", color);
}
}
但是,A-f
范围过大,并且匹配每个大写字符。它会将类似 #XXYYZZ
的“颜色”解析为有效颜色。
修复方法是改用大写 A-F
范围。
import java.util.regex.Pattern
public class Tester {
public static boolean is_valid_hex_color(String color) {
return Pattern.matches("#[0-9a-fA-F]{6}", color);
}
}
参考¶
GitHub Advisory Database:CVE-2021-42740:shell-quote 中命令中使用的特殊元素未正确中和
wh0.github.io:利用 CVE-2021-42740
Yosuke Ota:no-obscure-range
Paul Boyd:正则表达式 [,-.]
Common Weakness Enumeration:CWE-20.