跳转到主要内容

Python stdlib模块的XML炸弹防护

项目描述

Latest Version Supported Python versions Travis CI codecov PyPI downloads Code style: black

“这只是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>&ee;</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>&ee;</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

  1. Lxml能够抵御billion laughs攻击,并且默认不进行网络查找。

  2. libxml2和lxml并非直接易受gzip解压缩炸弹攻击,但它们也不提供对它们的保护。

  3. xml.etree不会展开实体,当实体出现时引发ParserError。

  4. minidom不会展开实体,并简单地返回未展开的实体。

  5. genshi 0.6的genshi.input不支持实体展开,当实体出现时引发ParserError。

  6. 库具有(有限的)XInclude支持,但需要额外的步骤来处理包含。

  7. 这些都是功能,但它们可能会引入可利用的漏洞,请参阅 其他需要考虑的事项

标准库中的设置

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, &apos;c:\Windows\system32\cmd.exe&apos;)"/>
   <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 (75.5 kB 查看哈希值)

上传时间:

构建版本

defusedxml-0.7.1-py2.py3-none-any.whl (25.6 kB 查看哈希值)

上传时间: Python 2 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面