Python参考手册
结构化标记 | Structured Markup
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 |
-
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功能。
结构化标记 | Structured Markup相关

Python 是一种面向对象的解释型计算机程序设计语言,由荷兰人 Guido van Rossum 于1989年发明,第一个公开发行版发行于1991年。 Python 是纯粹的自由软件, 源代码和解释器 CPython 遵循 GPL 协议。Python 语法简洁清晰,特色之一是强制用空白符( white space )作为语句缩进。
主页 | https://www.python.org/ |
源码 | https://github.com/python/cpython |
版本 | 2.7 |
发布版本 | 2.7.13 |