CodeQL 文档

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

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

点击查看 CodeQL 仓库中的查询

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