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
Trueif the string is a valid element or attribute name,Falseotherwise.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
Trueif the string is a sequence of legal XML 1.0 characters,Falseotherwise.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。