# 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 解析器绑定

This module also defines utility functions.

xml.is_valid_name(name)

  Return `True` if the string is a valid element or attribute name, `False` otherwise.

  Almost all characters are permitted in names, except control characters and those which either are or reasonably could be used as delimiters. Characters like ":", "-", ".", "_", and "·" are permitted, but "<", "/", "!", "?", and "=" are forbidden. The name cannot start with a digit or a character like "-", ".", and "·".

  Added in version 3.15.

xml.is_valid_text(data)

  Return `True` if the string is a sequence of legal XML 1.0 characters, `False` otherwise.

  Almost all characters are permitted in XML 1.0 documents, except C0 control characters (excluding TAB, CR and LF), surrogate characters and special Unicode characters U+FFFE and U+FFFF.

  Added in version 3.15.

## 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。