XML 处理模块¶
源代码: Lib/xml/
Python 用于处理 XML 的接口都归入 xml
包中。
备注
如果您需要解析不受信任或未经身份验证的数据,请参阅 XML 安全。
需要注意的是,xml
包中的模块要求至少有一个符合 SAX 标准的 XML 解析器可用。Expat 解析器随 Python 一起提供,因此 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 功能进行拒绝服务攻击,访问本地文件,生成到其他机器的网络连接,或绕过防火墙。
低于 2.6.0 版本的 Expat 可能容易受到“十亿笑”、“二次膨胀”和“大令牌”漏洞的影响。如果 Python 使用旧版本的 Expat 作为系统提供的库,则可能容易受到攻击。请检查 pyexpat.EXPAT_VERSION
。
xmlrpc
容易受到“解压缩炸弹”攻击。
- 十亿笑 / 指数实体扩展
十亿笑攻击——也称为指数实体扩展——使用多层嵌套实体。每个实体多次引用另一个实体,最终的实体定义包含一个小的字符串。指数扩展导致数千兆字节的文本,并消耗大量内存和 CPU 时间。
- 二次膨胀实体扩展
二次膨胀攻击类似于十亿笑攻击;它也滥用实体扩展。它不是嵌套实体,而是重复一个包含几千个字符的大实体。这种攻击不如指数情况有效,但它避免了触发禁止深度嵌套实体的解析器对策。
- 解压缩炸弹
解压缩炸弹(又称 ZIP 炸弹)适用于所有可以解析压缩 XML 流的 XML 库,例如 gzipped HTTP 流或 LZMA 压缩文件。对于攻击者来说,它可以将传输的数据量减少三个数量级或更多。
- 大令牌
Expat 需要重新解析未完成的令牌;如果没有 Expat 2.6.0 中引入的保护,这可能会导致二次运行时,可用于导致解析 XML 的应用程序的拒绝服务。此问题被称为 CVE 2023-52425。