CodeQL 文档

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

ID: rb/overly-large-range
Kind: problem
Security severity: 5.0
Severity: warning
Precision: high
Tags:
   - correctness
   - security
   - external/cwe/cwe-020
Query suites:
   - ruby-code-scanning.qls
   - ruby-security-extended.qls
   - ruby-security-and-quality.qls

单击查看 CodeQL 代码库中的查询

编写一个匹配比预期更广泛的字符范围的正则表达式范围很容易。例如,/[a-zA-z]/ 匹配所有小写字母和所有大写字母,正如您所预期的那样,但它还匹配以下字符:[ \ ] ^ _ `

另一个常见问题是未在正则表达式中转义连字符。未转义的连字符被解释为范围的一部分。例如,在字符类 [a-zA-Z0-9%=.,-_] 中,最后一个字符范围匹配 ,_ 之间的 55 个字符(包括两者),这与范围 [0-9] 重叠,显然不是编写者想要的。

建议

通过编写明确的正则表达式,避免对哪些字符包含在范围内的任何混淆。始终检查字符范围是否只匹配预期的字符。

示例

以下示例代码旨在检查字符串是否为有效的 6 位十六进制颜色。

def is_valid_hex_color(color)
    /^#[0-9a-fA-f]{6}$/.match(color)
end

但是,A-f 范围过于大,它匹配所有大写字符。它将像 #XXYYZZ 这样的“颜色”解析为有效。

解决方法是使用大写 A-F 范围。

def is_valid_hex_color(color)
    /^#[0-9a-fA-F]{6}$/.match(color)
end

参考文献

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