CodeQL 文档

过于宽泛的正则表达式范围

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

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

很容易编写一个正则表达式范围,它匹配的字符范围比你预期的更广。例如,/[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, Inc.
  • 条款
  • 隐私