20.4. XML处理模块

源代码: Lib / xml /

用于处理XML的Python接口分组在xml包中。

警告

XML模块对于错误或恶意构造的数据是不安全的。如果您需要解析不受信任或未经身份验证的数据,请参阅XML漏洞defusedxml和defusedexpat Packages部分。

重要的是要注意,xml包中的模块要求至少有一个符合SAX的XML解析器可用。Expat解析器包含在Python中,因此xml.parsers.expat模块将始终可用。

xml.domxml.sax包的文档是DOM和SAX接口的Python绑定的定义。

XML处理子模块是:

20.4.1. XML漏洞

XML处理模块对于恶意构造的数据是不安全的。攻击者可以滥用XML功能来执行拒绝服务攻击,访问本地文件,生成与其他计算机的网络连接或规避防火墙。

下表概述了已知的攻击以及各种模块是否易受攻击。

saxetreeminidompulldomxmlrpc
十亿笑
二次爆炸
外部实体扩展否(1)否(2)否(3)
DTD检索没有没有没有
减压炸弹没有没有没有没有
  1. xml.etree.ElementTree不会展开外部实体,并在实体发生时引发ParserError
  2. xml.dom.minidom不会展开外部实体,而是直接返回未展开的实体。
  3. xmlrpclib不会展开外部实体并省略它们。
十亿笑/指数实体扩张
Billion Laughs攻击 - 也称为指数实体扩展 - 使用多级嵌套实体。每个实体多次引用另一个实体,最终实体定义包含一个小字符串。指数扩展导致几GB的文本,并消耗大量的内存和CPU时间。
二次膨胀实体膨胀
二次爆发攻击类似于Billion Laughs攻击;它也滥用实体扩张。而不是嵌套的实体,它重复一个大型实体与几千个字符一遍又一遍。攻击不如指数情况那样有效,但它避免触发禁止深层嵌套实体的解析器对策。
外部实体扩展
实体声明可以包含多个替换的文本。它们还可以指向外部资源或本地文件。XML解析器访问资源并将内容嵌入到XML文档中。
DTD检索
某些XML库(如Python的xml.dom.pulldom)从远程或本地位置检索文档类型定义。该特征具有与外部实体扩展问题类似的影响。
减压炸弹
解压缩炸弹(aka ZIP炸弹)适用于所有可以解析压缩XML流(如gzip压缩的HTTP流或LZMA压缩文件)的XML库。对于攻击者,它可以将传输的数据量减少三个数量级或更多。

PyPI上defusedxml的文档有关于所有已知攻击向量的更多信息,包括示例和引用。

20.4.2. The defusedxml and defusedexpat Packages

defusedxml是一个纯Python包,其中包含所有stdlib XML解析器的已修改子类,可防止任何潜在的恶意操作。对于解析不受信任的XML数据的任何服务器代码,建议使用此程序包。该软件包还附带了有关更多XML漏洞(例如XPath注入)的示例漏洞和扩展文档。

defusedexpat提供了修改的libexpat和修补的pyexpat模块,它们具有针对实体扩展DoS攻击的对策。defusedexpat模块仍然允许完全可配置的实体扩展数量。这些修改可能包含在一些未来的Python版本中,但不会包含在任何Python修正版本中,因为它们会破坏向后兼容性。