XML处理模块

源代码: Lib / xml


/用于处理XML的Python接口分组在xml package.

Warning

XML模块对于错误或恶意构建的数据不安全。如果你需要解析不受信任的orunauthenticated数据,请参阅 XML漏洞 defusedxmldefusedexpat sections.

值得注意的是xml包中的模块要求至少有一个符合SAX的XML解析器可用。Expat解析器包含在Python中,所以xml.parsers.expat模块总是可用的.

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

XML处理子模块是:

  • xml.etree.ElementTree:ElementTree API,一个简单而轻量级的XML处理器
  • xml.domDOM API定义
  • xml.dom.minidom:一个最小的DOM实现
  • xml.dom.pulldom:支持构建部分DOM树
  • xml.sax:SAX2基类和便捷函数
  • xml.parsers.expat:Expat解析器绑定

XML漏洞

XML处理模块不能抵御恶意构造的数据。攻击者可能滥用XML功能执行拒绝服务攻击,访问本地文件,生成与其他计算机的网络连接,或者启动防火墙.

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

sax etree minidom pulldom xmlrpc
十亿笑 易受攻击 易受攻击 易受攻击 易受攻击 易受攻击
二次爆炸 易受攻击 易受攻击 易受攻击 易受攻击 易受攻击
外部实体扩展 安全(4) 安全(1) 安全(2) 安全(4) 安全(3)
DTD检索 安全(4) 安全 安全 安全(4) 安全
减压弹 安全 安全 安全 安全 弱势
  1. xml.etree.ElementTree不会扩展外部实体并在实体发生时提升ParserError.
  2. xml.dom.minidom不会扩展外部实体并且只是逐字地返回未扩展的实体.
  3. xmlrpclib不扩展外部实体并省略它们.
  4. 从Python 3.7.1开始,外部通用实体不再被默认处理
billion笑/指数实体扩展
Billion Laughs攻击 – 也称为指数实体扩展 – 使用多级嵌套实体。每个实体几次引用另一个实体,最后的实体定义包含一个小字符串。指数扩展产生几千兆字节的文本并占用大量的内存和CPU时间.
二次爆炸实体扩展
二次爆炸攻击类似于Billion Laughs攻击;滥用扩张也是如此。它不是嵌套实体,而是一遍又一遍地重复一个具有几千个字符的大型实体。攻击并不像指数情况那样有效,但它避免了触发解析器对策,禁止深层嵌套的实体.
外部实体扩展
实体声明可以包含的不仅仅是替换文本。他们还指向外部资源或本地文件。XMLparser访问资源并将内容嵌入到XML文档中.
DTD检索
某些XML库(如Python)xml.dom.pulldom从远程或本地位置检索文档类型定义。该特征具有相似性作为外部实体扩展问题.
压缩弹
减压炸弹(又名ZIP炸弹)适用于所有可以解析压缩XML流的XML库,例如gzip压缩流或LZMA压缩文件。对于攻击者来说,它可以将传输的数据量减少三个或更多.

PyPI上defusedxml的文档有关于所有已知攻击向量的更多信息,包括示例和参考文件.

defusedxmldefusedexpat

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

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

评论被关闭。