首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

XML Processing Modules

用于处理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滥用的攻击不熟悉的功能,如内联DTD(文档类型定义)与实体。

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

kind

sax

etree

minidom

pulldom

xmlrpc

billion laughs

Vulnerable

Vulnerable

Vulnerable

Vulnerable

Vulnerable

quadratic blowup

Vulnerable

Vulnerable

Vulnerable

Vulnerable

Vulnerable

external entity expansion

Vulnerable

Safe (1)

Safe (2)

Vulnerable

Safe (3)

DTD retrieval

Vulnerable

Safe

Safe

Vulnerable

Safe

decompression bomb

Safe

Safe

Safe

Safe

Vulnerable

  1. xml.etree.ElementTree 不会扩展外部实体,并在实体出现时引发ParserError。
  1. xml.dom.minidom 不会扩展外部实体,只是简单地返回未扩展的实体。
  1. 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功能。

扫码关注腾讯云开发者

领取腾讯云代金券