# XML处理模块

源码： Lib/xml/

用于处理XML的Python接口分组在 `xml` 包中。

备注

如果你需要解析不受信任或未经身份验证的数据，请参阅 XML 安全。

值得注意的是 `xml` 包中的模块要求至少有一个 SAX 兼容的 XML 解析器可用。在 Python 中包含 Expat 解析器，因此 `xml.parsers.expat` 模块将始终可用。

`xml.dom` 和 `xml.sax` 包的文档是 DOM 和 SAX 接口的 Python 绑定的定义。

XML 处理子模块包括:

- `xml.etree.ElementTree`： ElementTree API，一个简单而轻量级的XML处理器

- `xml.dom`：DOM API 定义

- `xml.dom.minidom`：最小的 DOM 实现

- `xml.dom.pulldom`：支持构建部分 DOM 树

- `xml.sax`：SAX2 基类和便利函数

- `xml.parsers.expat`：Expat解析器绑定

## XML 安全

攻击者可利用 XML 特性实施拒绝服务攻击、访问本地文件、建立与其他机器的网络连接，甚至绕过防火墙防护。

Expat库版本低于 2.6.0 可能存在以下安全漏洞："十亿笑声攻击"、"二次爆炸攻击" 和 "大令牌攻击"。 若Python 使用系统提供的旧版 Expat 库，则可能受这些漏洞影响。 可通过检查常量 `pyexpat.EXPAT_VERSION` 确认当前版本。

`xmlrpc` 面对 "解压缩炸弹" 攻击时是 脆弱的。

billion laughs / exponential entity expansion （狂笑/递归实体扩展）

  Billion Laughs 攻击 -- 也称为递归实体扩展 -- 使用多级嵌套实体。 每个实体多次引用另一个实体，最终实体定义包含一个小字符串。 指数级扩展导致几千 GB 的文本，并消耗大量内存和 CPU 时间。

quadratic blowup entity expansion（二次爆炸实体扩展）

  二次爆炸攻击类似于 Billion Laughs 攻击；它也滥用了实体扩展。 它不是嵌套实体，而是一遍又一遍地重复一个具有几千个字符的大型实体。 这种攻击不如递归情况有效，但它可避免触发禁止深度嵌套实体的解析器对策。

decompression bomb

  Decompression bombs（解压炸弹，又名 ZIP bomb）适用于所有可以解析压缩 XML 流（例如 gzip 压缩的 HTTP 流或 LZMA 压缩的文件）的 XML 库。 对于攻击者来说，它可以将传输的数据量减少三个量级或更多。

解析大量词元

  Expat 需要重新解析未完成的词元；在没有 Expat 2.6.0 所引入的防护措施的情况下，这会导致可被用来在解析 XML 的应用程序中制造拒绝服务攻击的指数级运行时间。 此问题被称为 CVE 2023-52425。