Python stdlib模块的XML炸弹防护
项目描述
“这只是XML,可能出什么问题?”
Christian Heimes <christian@python.org>
概述
攻击有漏洞的XML库的结果可能是相当严重的。攻击者只需要几百字节XML数据就可以在几秒钟内占用几个GB的内存。攻击者还可以用小到中等大小的请求长时间占用CPU。在某些情况下,甚至可以访问您服务器上的本地文件,绕过防火墙,或滥用服务将攻击反弹给第三方。
这些攻击使用和滥用了XML及其解析器较少见的特性。大多数开发人员对XML从SGML继承的诸如处理指令和实体扩展等特性不熟悉。他们最多只了解来自HTML经验的<!DOCTYPE>,但并不知道文档类型定义(DTD)可以生成HTTP请求或从文件系统加载文件。
所有问题都不是新的。这些问题已经存在很长时间了。"十亿笑声"首次在2003年报告。尽管如此,一些XML库和应用程序仍然容易受到攻击,甚至重用的XML用户对这些特性也会感到惊讶。很难说应该责怪谁。将所有责任都归咎于使用不安全默认设置的XML解析器和XML库是过于短视的。毕竟,它们正确地实现了XML规范。应用程序开发者不能指望库默认配置为安全和可能有害的数据。
攻击向量
十亿笑声/指数实体扩展
《十亿笑声》攻击——也称为指数实体扩展——使用多层嵌套实体。原始示例使用每层10个扩展的9层来扩展字符串“lol”到3 * 10^9字节的字符串,因此得名“十亿笑声”。生成的字符串占用3 GB(2.79 GiB)的内存;中间字符串需要额外的内存。由于大多数解析器不缓存每个扩展的中间步骤,因此它被重复执行。这增加了CPU负载。
仅几百字节的XML文档可以在几秒钟内使机器上的所有服务中断。
示例XML
<!DOCTYPE xmlbomb [ <!ENTITY a "1234567890" > <!ENTITY b "&a;&a;&a;&a;&a;&a;&a;&a;"> <!ENTITY c "&b;&b;&b;&b;&b;&b;&b;&b;"> <!ENTITY d "&c;&c;&c;&c;&c;&c;&c;&c;"> ]> <bomb>&d;</bomb>
二次方爆炸实体扩展
二次方爆炸攻击类似于《十亿笑声》攻击;它也滥用实体扩展。它不是嵌套实体,而是重复使用几千个字符的大实体。攻击不如指数情况高效,但它避免了触发解析器对深度嵌套实体的反制措施。一些解析器限制单个实体的深度和宽度,但不限制整个XML文档中扩展文本的总数。
带有几百千字节的中等大小XML文档需要几百MB到几个GB的内存。当攻击与某种程度的嵌套扩展结合时,攻击者能够实现更高的成功率。
<!DOCTYPE bomb [ <!ENTITY a "xxxxxxx... a couple of ten thousand chars"> ]> <bomb>&a;&a;&a;... repeat</bomb>
外部实体扩展(远程)
实体声明可以包含不仅仅是文本用于替换的内容。它们还可以通过公共标识符或系统标识符指向外部资源。系统标识符是标准的URI。当URI是URL(例如,一个 http:// 定位器)时,一些解析器会从远程位置下载资源并将其直接嵌入XML文档。
解析外部实体的简单示例
<!DOCTYPE external [ <!ENTITY ee SYSTEM "https://pythonlang.cn/some.xml"> ]> <root>ⅇ</root>
解析外部实体的情况仅适用于有效的XML内容。XML标准还支持带有 NData 声明 的未解析外部实体。
外部实体展开为各种漏洞敞开了大门。攻击者可以利用有漏洞的XML库和应用来回弹和转发网络请求,使用服务器的IP地址。可能的漏洞类型取决于解析器和应用,例如:
攻击者可以绕过防火墙并访问受限资源,因为所有请求都来自内部和可信的IP地址,而不是外部。
攻击者可以利用一项服务来攻击、监视或DoS您的服务器,甚至第三方的服务。攻击被伪装成服务器的IP地址,攻击者能够利用大机器的高带宽。
攻击者可能会耗尽机器上的额外资源,例如通过向不响应或响应非常大型文件的服务发送请求。
攻击者可能会获取关于XML文档何时、多频繁以及从哪个IP地址访问的信息。
如果URL处理程序支持 smtp:// URI,攻击者可能能够从您的网络内部发送邮件。
外部实体扩展(本地文件)
引用本地文件的外部实体是外部实体展开的一个子情况。它被列为额外的攻击,因为它值得额外关注。一些XML库(如lxml)默认禁用网络访问,但仍允许通过本地文件访问进行实体展开。本地文件可以通过 file:// URL 或文件路径(无论是相对的还是绝对的)进行引用。
攻击者可能能够访问和下载应用程序进程可以读取的所有文件,这可能会包括关键的配置文件。
<!DOCTYPE external [ <!ENTITY ee SYSTEM "file:///PATH/TO/simple.xml"> ]> <root>ⅇ</root>
DTD检索
这种情况与外部实体展开类似。一些XML库(如Python的xml.dom.pulldom)从远程或本地位置检索文档类型定义。外部实体情况中的几个攻击场景也适用于这个问题。
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head/> <body>text</body> </html>
Python XML库
类型 |
sax |
etree |
minidom |
pulldom |
xmlrpc |
lxml |
genshi |
---|---|---|---|---|---|---|---|
billion laughs |
True |
True |
True |
True |
True |
False (1) |
False (5) |
二次爆炸 |
True |
True |
True |
True |
True |
True |
False (5) |
外部实体扩展(远程) |
True |
False (3) |
False (4) |
True |
false |
False (1) |
False (5) |
外部实体扩展(本地文件) |
True |
False (3) |
False (4) |
True |
false |
True |
False (5) |
DTD检索 |
True |
False |
False |
True |
false |
False (1) |
False |
gzip bomb |
False |
False |
False |
False |
True |
部分 (2) |
False |
xpath支持 (7) |
False |
False |
False |
False |
False |
True |
False |
xsl(t)支持 (7) |
False |
False |
False |
False |
False |
True |
False |
xinclude支持 (7) |
False |
True (6) |
False |
False |
False |
True (6) |
True |
C库 |
expat |
expat |
expat |
expat |
expat |
libxml2 |
expat |
Lxml能够抵御billion laughs攻击,并且默认不进行网络查找。
libxml2和lxml并非直接易受gzip解压缩炸弹攻击,但它们也不提供对它们的保护。
xml.etree不会展开实体,当实体出现时引发ParserError。
minidom不会展开实体,并简单地返回未展开的实体。
genshi 0.6的genshi.input不支持实体展开,当实体出现时引发ParserError。
库具有(有限的)XInclude支持,但需要额外的步骤来处理包含。
这些都是功能,但它们可能会引入可利用的漏洞,请参阅 其他需要考虑的事项
标准库中的设置
xml.sax.handler功能
- feature_external_ges (http://xml.org/sax/features/external-general-entities)
禁用外部实体展开
- feature_external_pes (http://xml.org/sax/features/external-parameter-entities)
此选项会被忽略,不会修改任何功能
DOM xml.dom.xmlbuilder.Options
- 外部参数实体
忽略
- 外部通用实体
忽略
- 外部DTD子集
忽略
- 实体
不确定
defusedxml
defusedxml 包 (defusedxml 在 PyPI) 包含了几个仅适用于 Python 的解决方案和修复,以解决 Python XML 库中的拒绝服务和其他漏洞。为了利用这种保护,只需导入并使用正确的 defusedxml 模块中列出的函数/类,而不是原始模块。仅 defusedxml.xmlrpc 以猴子补丁的方式实现。
而不是
>>> from xml.etree.ElementTree import parse >>> et = parse(xmlfile)
修改代码为
>>> from defusedxml.ElementTree import parse >>> et = parse(xmlfile)
此外,该包还有一个 未经测试 的函数,用于猴子补丁所有 stdlib 模块,使用 defusedxml.defuse_stdlib()。
所有函数和解析器类接受三个额外的关键字参数。它们返回原始函数的相同对象或兼容的子类。
- forbid_dtd (默认: False)
禁止带有 <!DOCTYPE> 处理指令的 XML,并在找到 DTD 处理指令时引发 DTDForbidden 异常。
- forbid_entities (默认: True)
禁止带有 <!ENTITY> 声明的 XML,并在发现实体声明时引发 EntitiesForbidden 异常。
- forbid_external (默认: True)
禁止外部实体或 DTD 中对远程或本地资源的任何访问,并在 DTD 或实体引用外部资源时引发 ExternalReferenceForbidden 异常。
defusedxml(包)
DefusedXmlException, DTDForbidden, EntitiesForbidden, ExternalReferenceForbidden, NotSupportedError
defuse_stdlib() (实验性)
defusedxml.cElementTree
注意 defusedxml.cElementTree 已弃用,将在未来的版本中删除。请从 defusedxml.ElementTree 导入。
parse(), iterparse(), fromstring(), XMLParser
defusedxml.ElementTree
parse(), iterparse(), fromstring(), XMLParser
defusedxml.expatreader
create_parser(), DefusedExpatParser
defusedxml.sax
parse(), parseString(), make_parser()
defusedxml.expatbuilder
parse(), parseString(), DefusedExpatBuilder, DefusedExpatBuilderNS
defusedxml.minidom
parse(), parseString()
defusedxml.pulldom
parse(), parseString()
defusedxml.xmlrpc
修复作为 stdlib 的 xmlrpc 包(3.x)或 xmlrpclib 模块(2.x)的猴子补丁实现。函数 monkey_patch() 启用修复,unmonkey_patch() 移除补丁并将代码恢复到以前的状态。
猴子补丁可以防止与 XML 相关的攻击以及解压缩炸弹以及过大的请求或响应。默认设置是 30 MB 的请求、响应和 gzip 解压缩。您可以通过更改模块变量 MAX_DATA 来修改默认设置。值 -1 禁用限制。
defusedxml.lxml
弃用 该模块已弃用,将在未来的版本中删除。
该模块作为一个 示例,说明您如何保护使用 lxml.etree 的代码。它实现了一个自定义 Element 类,用于过滤实体实例,一个自定义解析器工厂以及一个线程局部存储用于解析器实例。它还有一个 check_docinfo() 函数,用于检查树中的内部或外部 DTD 以及实体声明。为了检查实体,需要 lxml > 3.0。
parse(), fromstring() RestrictedElement, GlobalParserTLS, getDefaultParser(), check_docinfo()
defusedexpat
defusedexpat 包 (defusedexpat 在 PyPI) 随带二进制扩展和修改后的 expat 库,而不是标准的 expat 解析器。它基本上是 Python 标准库 C 扩展的补丁的独立版本。
expat中的修改
新定义
XML_BOMB_PROTECTION XML_DEFAULT_MAX_ENTITY_INDIRECTIONS XML_DEFAULT_MAX_ENTITY_EXPANSIONS XML_DEFAULT_RESET_DTD
新的 XML_FeatureEnum 成员
XML_FEATURE_MAX_ENTITY_INDIRECTIONS XML_FEATURE_MAX_ENTITY_EXPANSIONS XML_FEATURE_IGNORE_DTD
新的 XML_Error 成员
XML_ERROR_ENTITY_INDIRECTIONS XML_ERROR_ENTITY_EXPANSION
新的 API 函数
int XML_GetFeature(XML_Parser parser, enum XML_FeatureEnum feature, long *value); int XML_SetFeature(XML_Parser parser, enum XML_FeatureEnum feature, long value); int XML_GetFeatureDefault(enum XML_FeatureEnum feature, long *value); int XML_SetFeatureDefault(enum XML_FeatureEnum feature, long value);
- XML_FEATURE_MAX_ENTITY_INDIRECTIONS
限制在嵌套实体展开过程中允许发生的间接引用数量。当遇到实体引用时开始计数,实体完全展开后重置。此限制可以保护解析器免受指数级实体展开攻击(也称为“亿笑攻击”)。当超过限制时,解析器停止并失败,错误代码为XML_ERROR_ENTITY_INDIRECTIONS。值为0将禁用此保护。
- 支持范围
0 .. UINT_MAX
- 默认值
40
- XML_FEATURE_MAX_ENTITY_EXPANSIONS
限制整个文档中所有实体展开的总长度。所有实体的长度都累计在解析器变量中。此设置可以防止二次爆炸攻击(大量展开大实体声明)。当所有实体的总和超过限制时,解析器停止并失败,错误代码为XML_ERROR_ENTITY_EXPANSION。值为0将禁用此保护。
- 支持范围
0 .. UINT_MAX
- 默认值
8 MiB
- XML_FEATURE_RESET_DTD
在解析完<!DOCTYPE>块后重置所有DTD信息。当此标志被设置(默认:false)时,在调用endDoctypeDeclHandler之后的所有DTD信息都将被重置。该标志可以在endDoctypeDeclHandler内部设置。如果没有DTD信息,则文档主体中的任何实体引用都将导致XML_ERROR_UNDEFINED_ENTITY错误。
- 支持范围
0, 1
- 默认值
0
如何避免XML漏洞
最佳实践
不允许DTD
不允许展开实体
不允许解析外部实体
限制解析深度
限制总输入大小
限制解析时间
对于潜在的大量数据,优先使用SAX或iterparse类似的解析器
验证并正确引用XSL转换和XPath查询的参数
不要使用来自不可信来源的XPath表达式
不要应用来自不可信来源的XSL转换
(基于Brad Hill的Attacking XML Security)
其他需要注意的事项
XML、XML解析器和处理库具有更多功能和可能的问题,可能导致DoS漏洞或应用程序中的安全漏洞。我整理了一个不完整的问题列表,需要进一步研究和更多关注。此列表故意持悲观态度,并且有点偏执。它包含在疯狂情况下可能出错的事情。
属性爆炸/哈希冲突攻击
XML解析器可能使用具有二次运行时间O(n^2)的算法来处理属性和命名空间。如果它使用哈希表(字典)来存储属性和命名空间,则其实施可能容易受到哈希碰撞攻击,从而将性能降低到O(n^2)。在任何情况下,攻击者都能够使用包含数千个属性的单一节点中的XML文档伪造拒绝服务攻击。
我尚未研究expat、pyexpat或libxml2是否易受攻击。
解压缩炸弹
解压缩炸弹(也称为ZIP bomb)问题适用于所有可以解析压缩XML流(如gzip HTTP流或LZMA文件)的XML库。对于攻击者来说,它可以减少传输数据的量达三个数量级或更多。Gzip可以将1 GiB的零压缩到大约1 MB,而lzma更好。
$ dd if=/dev/zero bs=1M count=1024 | gzip > zeros.gz $ dd if=/dev/zero bs=1M count=1024 | lzma -z > zeros.xy $ ls -sh zeros.* 1020K zeros.gz 148K zeros.xy
除了xmlrpclib之外,Python的所有标准XML库都不解压缩流。该模块容易受到解压缩炸弹的攻击<https://bugs.python.org/issue16043>。
lxml可以通过libxml2透明地加载和处理压缩数据。libxml2可以有效地处理非常大的压缩数据块,而不会消耗太多内存。但它不能保护应用程序免受解压缩炸弹的攻击。一个精心编写的SAX或iterparse类似的方法可能是安全的。
处理指令
处理指令如
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
可能对XML处理带来更多威胁。这取决于处理器如何处理处理指令。使用网络或本地文件访问检索URL的问题也适用于处理指令。
其他DTD功能
DTD 具有更多功能,如 <!NOTATION>。我还没有研究这些功能可能成为安全威胁的方式。
XPath
XPath语句可能引入DoS漏洞。代码永远不应该从不受信任的来源执行查询。攻击者也可能能够创建一个XML文档,使某些XPath查询成本高昂或资源密集。
XPath注入攻击
XPath注入攻击基本上与SQL注入攻击类似。XPath查询的参数必须正确引用和验证,特别是当它们来自用户时。页面 避免XPath注入的危险 列出了一些XPath注入的后果。
Python的标准库没有XPath支持。Lxml支持参数化XPath查询,并正确引用。只需正确使用其xpath()方法即可。
# DON'T >>> tree.xpath("/tag[@id='%s']" % value) # instead do >>> tree.xpath("/tag[@id=$tagid]", tagid=name)
XInclude
XML Inclusion 是另一种加载和包含外部文件的方法。
<root xmlns:xi="http://www.w3.org/2001/XInclude"> <xi:include href="filename.txt" parse="text" /> </root>
在处理来自不受信任来源的XML文件时,应禁用此功能。一些Python XML库和libxml2支持XInclude,但没有选项来沙盒包含并将其限制在允许的目录中。
XMLSchema位置
验证XML解析器可能会从 xsi:schemaLocation 属性中的信息下载模式文件。
<ead xmlns="urn:isbn:1-931666-22-9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:isbn:1-931666-22-9 http://www.loc.gov/ead/ead.xsd"> </ead>
XSL转换
你应该记住,XSLT是一种图灵完备的语言。永远不要处理来自未知或不信任来源的XSLT代码!XSLT处理器可能允许你以你甚至想象不到的方式与外部资源进行交互。一些处理器甚至支持允许读写访问文件系统、访问JRE对象或使用Jython进行脚本处理的扩展。
来自攻击XML安全的Xalan-J示例
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rt="http://xml.apache.org/xalan/java/java.lang.Runtime" xmlns:ob="http://xml.apache.org/xalan/java/java.lang.Object" exclude-result-prefixes= "rt ob"> <xsl:template match="/"> <xsl:variable name="runtimeObject" select="rt:getRuntime()"/> <xsl:variable name="command" select="rt:exec($runtimeObject, 'c:\Windows\system32\cmd.exe')"/> <xsl:variable name="commandAsString" select="ob:toString($command)"/> <xsl:value-of select="$commandAsString"/> </xsl:template> </xsl:stylesheet>
其他语言/框架
其他几种编程语言和框架也存在漏洞。其中一些受到libxml2 2.9.0之前没有针对二次爆炸攻击的保护的影响。大多数它们在实体扩展和外部实体方面也有潜在危险的自定义设置。
Perl
Perl的XML::Simple库容易受到二次实体扩展和外部实体扩展(本地和远程)的影响。
Ruby
Ruby的REXML文档解析器容易受到实体扩展攻击(二次和指数),但默认情况下不执行外部实体扩展。为了对抗实体扩展,你必须禁用此功能。
REXML::Document.entity_expansion_limit = 0
libxml-ruby和hpricot在其默认配置中不会扩展实体。
PHP
PHP的SimpleXML API容易受到二次实体扩展的影响,并从本地和远程资源加载实体。选项 LIBXML_NONET 禁用了网络访问,但仍允许本地文件访问。 LIBXML_NOENT 似乎在PHP 5.4.6中对实体扩展没有影响。
C# / .NET / Mono
XML DoS和防御(MSDN) 中的信息表明,.NET在默认设置下容易受到攻击。文章包含创建安全XML读取器的代码片段。
XmlReaderSettings settings = new XmlReaderSettings(); settings.ProhibitDtd = false; settings.MaxCharactersFromEntities = 1024; settings.XmlResolver = null; XmlReader reader = XmlReader.Create(stream, settings);
Java
未测试。Xerces及其Xerces SecurityManager的文档听起来像Xerces在其默认设置下也容易受到亿笑攻击。当配置了org.xml.sax.EntityResolver时,它也会进行实体解析。我还没有确定这里的默认设置。
Java专家建议使用自定义构建器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); builderFactory.setXIncludeAware(False); builderFactory.setExpandEntityReferences(False); builderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, True); # either builderFactory.setFeature("https://apache.ac.cn/xml/features/disallow-doctype-decl", True); # or if you need DTDs builderFactory.setFeature("http://xml.org/sax/features/external-general-entities", False); builderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", False); builderFactory.setFeature("https://apache.ac.cn/xml/features/nonvalidating/load-external-dtd", False); builderFactory.setFeature("https://apache.ac.cn/xml/features/nonvalidating/load-dtd-grammar", False);
待办事项
DOM: 使用xml.dom.xmlbuilder选项处理实体
SAX: 考虑feature_external_ges和feature_external_pes (?)
测试stdlib模块的实验性猴子补丁
改进文档
许可证
版权(c)2013-2017由Christian Heimes所有 <christian@python.org>
根据贡献协议许可给PSF。
有关许可详情,请参阅https://pythonlang.cn/psf/license。
鸣谢
- Brett Cannon(Python核心开发者)
审查和代码清理
- Antoine Pitrou(Python核心开发者)
代码审查
- Aaron Patterson,Ben Murphy和Michael Koziarski(Ruby社区)
感谢Ruby社区的Aaron,Ben和Michael提供报告和协助。
- Thierry Carrez(OpenStack)
感谢Thierry代表OpenStack安全团队向Python安全响应团队报告。
- Carl Meyer(Django)
感谢Carl代表Django安全团队向PSRT报告。
- Daniel Veillard(libxml2)
感谢Daniel对libxml2的见解和协助。
- semantics GmbH (https://www.semantics.de/)
感谢我的雇主semantics允许我在工作时间内作为semantics开源计划的一部分处理这个问题。
参考文献
变更日志
defusedxml 0.7.1
发布日期:2021-03-08
修复回归 defusedxml.ElementTree.ParseError (#63) 现在的ParseError异常再次是xml.etree.ElementTree.ParseError相同的类对象。
defusedxml 0.7.0
发布日期:2021-03-04
无更改
defusedxml 0.7.0rc2
发布日期:2021-01-12
重新添加并弃用 defusedxml.cElementTree
使用GitHub Actions而不是TravisCI
修补后恢复 ElementTree 模块的 xml.etree 属性
defusedxml 0.7.0rc1
发布日期:2020-05-04
添加对Python 3.9的支持
defusedxml.cElementTree在Python 3.9中不可用。
Python 2已弃用。在0.8.0中将移除对Python 2的支持。
defusedxml 0.6.0
发布日期:2019-04-17
增加测试覆盖率。
向README添加徽章。
defusedxml 0.6.0rc1
发布日期:2019-04-14
在Python 3.7稳定版和3.8-dev上测试
放弃对Python 3.4的支持
不再向XMLParse传递html参数。该参数已被弃用且长时间被忽略。DefusedXMLParser仍接受html参数。当参数为False时发出弃用警告,当参数为True时发出TypeError。
当pyexpat stdlib模块不可用或损坏时,defusedxml现在会早期失败。
defusedxml.ElementTree.__all__现在列出ParseError作为公共属性。
defusedxml.ElementTree和defusedxml.cElementTree模块有一个拼写错误,并使用XMLParse而不是XMLParser作为DefusedXMLParser的别名。现在两个旧的和修复的名称都可用。
defusedxml 0.5.0
发布日期:2017-02-07
无更改
defusedxml 0.5.0.rc1
发布日期:2017-01-28
添加对Python 3.6的兼容性
放弃对Python 2.6、3.1、3.2、3.3的支持
修复lxml测试(XMLSyntaxError:检测到实体引用循环)
defusedxml 0.4.1
发布日期:2013-03-28
添加更多演示漏洞,例如python_external.py和Xalan XSLT演示。
改进文档。
defusedxml 0.4
发布日期:2013-02-25
根据http://seclists.org/oss-sec/2013/q1/340,请拒绝CVE-2013-0278、CVE-2013-0279和CVE-2013-0280,并使用CVE-2013-1664、CVE-2013-1665为OpenStack等。
将缺少的parser_list参数添加到sax.make_parser()中。虽然该参数被忽略,但感谢Florian Apolloner。
添加针对Python的SAX解析器、XML-RPC和WebDAV的外部实体攻击的演示利用。
defusedxml 0.3
发布日期:2013年2月19日
改进文档
defusedxml 0.2
发布日期:2013年2月15日
将ExternalEntitiesForbidden重命名为ExternalReferenceForbidden
将defusedxml.lxml.check_dtd()重命名为check_docinfo()
在回调中统一参数名称
将参数和格式化表示添加到异常中
将forbid_external参数添加到所有函数和类中
更多测试
大量文档
为其他语言(Ruby、Perl、PHP)和解析器(Genshi)添加示例代码
为xmlrpclib添加针对XML和gzip攻击的保护
defusedxml 0.1
发布日期:2013年2月8日
PSRT审查的初始和内部发布
项目详情
下载文件
下载适合您平台文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源代码分发
构建版本
defusedxml-0.7.1.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69 |
|
MD5 | a50e7f21aa60a741efe6b1b658dfb3f8 |
|
BLAKE2b-256 | 0fd5c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72 |
defusedxml-0.7.1-py2.py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61 |
|
MD5 | f0f8408ec7056772fe2872cc31b55640 |
|
BLAKE2b-256 | 076caa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4 |