过于宽松的正则表达式范围¶
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
编写一个匹配比预期更广泛的字符范围的正则表达式范围很容易。例如,/[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
参考文献¶
GitHub 漏洞数据库:CVE-2021-42740:在 Shell-quote 中使用命令时,对特殊元素的错误中和
wh0.github.io:利用 CVE-2021-42740
Yosuke Ota:no-obscure-range
Paul Boyd:The regex [,-.]
通用弱点枚举:CWE-20。