在线文档教程

XML Processing Modules

XML处理模块

用于处理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处理模块对于恶意构建的数据不安全。攻击者可以滥用漏洞,例如拒绝服务攻击,访问本地文件,生成到其他机器的网络连接,或绕过防火墙。对XML滥用的攻击不熟悉的功能,如内联DTD(文档类型定义)与实体。

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

kindsaxetreeminidompulldomxmlrpc
billion laughsVulnerableVulnerableVulnerableVulnerableVulnerable
quadratic blowupVulnerableVulnerableVulnerableVulnerableVulnerable
external entity expansionVulnerableSafe (1)Safe (2)VulnerableSafe (3)
DTD retrievalVulnerableSafeSafeVulnerableSafe
decompression bombSafeSafeSafeSafeVulnerable

  • xml.etree.ElementTree 不会扩展外部实体,并在实体出现时引发ParserError。

  • xml.dom.minidom 不会扩展外部实体,只是简单地返回未扩展的实体。

  • xmlrpclib 不会扩展外部实体并将其忽略。

billion laughs/指数实体扩展billion laughs攻击 - 也称为指数实体扩展 - 使用多层次的嵌套实体。每个实体多次引用另一个实体,最终的实体定义包含一个小字符串。最终,小字符串被扩展为几个千兆字节。指数扩展也消耗大量CPU时间。四次爆炸实体扩展二次爆炸攻击类似于billion laughs攻击; 它也滥用实体扩张。它不是嵌套的实体,而是一遍又一遍地重复一个带有几千个字符的大型实体。这种攻击并不像指数案例那样高效,但它避免了触发反对大量嵌套实体的解析器的对策。外部实体expansionEntity声明可以包含不止是用于替换的文本。他们还可以通过公共标识符或系统标识符指向外部资源。系统标识符是标准URI或可以引用本地文件。XML解析器通过例如HTTP或FTP请求来检索资源,并将内容嵌入到XML文档中。DTD检索像Python的一些XML库xml.dom.pulldom从远程或本地位置检索文档类型定义。该功能与外部实体扩展问题具有相似的含义。解压缩炸弹解压缩炸弹(又名ZIP炸弹)的问题适用于所有可解析压缩XML流(如gzipped HTTP流或LZMA-ed文件)的XML库。对于攻击者来说,它可以将传输的数据量减少三个或更多。

PyPI上的defusedxml文档提供了有关所有已知攻击媒介的更多信息,其中包含示例和引用。

1.解包

建议这些外部软件包用于解析不可信XML数据的任何代码。

defusedxml是一个纯Python包,包含所有stdlib XML解析器的子类,用于防止任何潜在的恶意操作。该软件包还附带有关于xpath注入等更多XML漏洞的示例漏洞利用和扩展文档。

defusedexpat提供修改后的libexpat和补丁替换pyexpat扩展模块,以应对实体扩展DoS攻击。Defusedexpat仍然允许一个理智的和可配置的实体展开量。这些修改将被合并到未来的Python版本中。

修补程序版本中不包含变通方法和修改,因为它们会破坏向后兼容性。所有内联DTD和实体扩展都是定义明确的XML功能。