On this page
XML 处理模块
源代码: Lib/xml/
用于处理 XML 的 Python 接口在xml
包中进行了分组。
Warning
XML 模块对于错误或恶意构建的数据并不安全。如果您需要解析不可信或未经身份验证的数据,请参见XML vulnerabilities和defusedxml 和 defusedexpat 软件包部分。
重要的是要注意,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:SAX2Base Class 和便利Function
xml.parsers.expat:Expat 解析器绑定
XML vulnerabilities
XML 处理模块不能防止恶意构建的数据。攻击者可以滥用 XML Function进行拒绝服务攻击,访问本地文件,与其他计算机构建网络连接或规避防火墙。
下表概述了已知的攻击以及各个模块是否容易受到攻击。
kind | sax | etree | minidom | pulldom | xmlrpc |
---|---|---|---|---|---|
billion laughs | Vulnerable | Vulnerable | Vulnerable | Vulnerable | Vulnerable |
quadratic blowup | Vulnerable | Vulnerable | Vulnerable | Vulnerable | Vulnerable |
外部实体扩张 | Safe (4) | Safe (1) | Safe (2) | Safe (4) | Safe (3) |
DTD retrieval | Safe (4) | Safe | Safe | Safe (4) | Safe |
decompression bomb | Safe | Safe | Safe | Safe | Vulnerable |
xml.etree.ElementTree不会展开外部实体,当出现实体时会引发
ParserError
。xml.dom.minidom不会展开外部实体,而只会逐字返回未展开的实体。
xmlrpclib
不会扩展外部实体并忽略它们。从 Python 3.7.1 开始,默认情况下不再处理外部通用实体。
十亿笑声/指数实体扩张
- Billion Laughs攻击(也称为指数实体扩展)使用多层嵌套实体。每个实体多次引用另一个实体,并且finally实体定义包含一个小字符串。指数级扩展会导致数千兆字节的文本,并消耗大量内存和 CPU 时间。
二次爆炸实体扩展
- 二次爆炸攻击类似于Billion Laughs攻击;它也滥用实体扩张。而不是嵌套实体,它一遍又一遍地重复一个带有几千个字符的大型实体。攻击的效率不及指数级情况,但可以避免触发禁止深度嵌套实体的解析器对策。
外部实体扩张
- 实体语句可以包含的内容不止是要替换的文本。它们还可以指向外部资源或本地文件。 XML 解析器访问资源并将内容嵌入到 XML 文档中。
DTD retrieval
- 一些 XML 库(例如 Python 的xml.dom.pulldom)从远程或本地位置检索文档类型定义。该Function与外部实体扩展问题具有相似的含义。
decompression bomb
- 解压缩炸弹(也称为ZIP bomb)适用于所有 XML 库,这些库可以解析压缩的 XML 流,例如压缩的 HTTP 流或 LZMA 压缩的文件。对于攻击者而言,它可以将传输的数据量减少三个数量级或更多。
有关 PyPI 的defusedxml的文档提供了有关所有已知攻击媒介的更多信息,并提供了示例和参考。
defusedxml 和 defusedexpat 软件包
defusedxml是纯 Python 程序包,具有所有 stdlib XML 解析器的修改后的子类,可以防止任何潜在的恶意操作。建议对解析不受信任的 XML 数据的任何服务器代码使用此包。该软件包还附带示例漏洞利用程序以及有关更多 XML 漏洞利用程序(例如 XPath 注入)的扩展文档。
defusedexpat提供了经过修改的 libexpat 和修补的pyexpat
模块,这些模块具有针对实体扩展 DoS 攻击的对策。 defusedexpat
模块仍允许进行合理且可配置的实体扩展。这些修改可能会包含在将来的某些 Python 版本中,但不会包含在 Python 的任何错误修正版本中,因为它们破坏了向后兼容性。