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