Seth Michael Larson:当 str.lowe... 笔记

Seth Michael Larson:当 str.lower() 成为 Python 中的安全漏洞时”

互联网标准通常缺乏对非 ASCII 字符的支持,因此需要为域名进行映射。NamePrep 定义于 RFC 3491,作为 IDNA 2003 的一部分,旨在实现此目的。该旧版 IDNA 标准随后已被 IDNA 2008 所取代,后者规定于 RFC 5890 至 RFC 5893。Python 提供对这两个版本的支持:IDNA 2003 可通过 idna 编解码器访问,而 IDNA 2008 则通过外部 idna 包访问。Python 标准库中的 stringprep 模块实现了 StringPrep。StringPrep 的关键步骤是“大小写折叠”,即为了进行不区分大小写的比较,将字符映射为小写或大写。该过程利用 RFC 3454 中的映射表 B.2 和 B.3,这些表基于 Unicode 3.2.0 规则。在 Python 的实现中发现了一个漏洞:标准 str.lower() 函数使用更新的 Unicode 版本,偏离了所需的 Unicode 3.2.0 大小写折叠规则。这种不一致导致某些字符产生不同的 IDNA 编码。修复方法是创建特定例外,以确保 Python 的 str.lower() 行为在 StringPrep 和 IDNA 计算中与 Unicode 3.2.0 保持一致。此修复确保了 IDNA 2003 与其规范的兼容性。