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 特性来实施拒绝服务攻击、访问本地文件、生成与其他机器
的网络连接，甚至是在攻击者控制的 XML 在 Python 中或其他地方被解析时绕
过防火墙。

Python 用于解析 XML 的内置 XML 解析器依赖于 libexpat 库，通常称为
Expat。

在默认情况下，Expat 本身不会访问本地文件或创建网络连接。

低于 2.7.2 的 Expat 版本可能会受到 "billion laughs"、"quadratic
blowup" 和 "large tokens" 等漏洞以及动态内存不恰当使用的影响。 Python
捆绑了一份 Expat 的拷贝，而 Python 是使用捆绑的还是系统级的 Expat 取决
于在你的环境中 Python 解释器 "是如何配置的"。 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 库。
   对于攻击者来说，它可以将传输的数据量减少三个量级或更多。

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