使用修改过的expat解析器的XML炸弹防护
项目描述
defusedexpat保护Python标准库的XML包免受多种拒绝服务漏洞和外部实体攻击。它包含
- 修改和增强的expat解析器库版本 
- pyexpat和cElementTree的_elementtree扩展模块的替代方案 
- 替换内置扩展的加载器代码 
- 对xml.sax和xml.dom的猴子补丁,以防止外部实体展开 
为了保护您的应用程序,您必须在导入stdlib的任何XML模块之前导入defusedxml模块。
对策
- 有限的实体展开级别,以对抗亿万笑攻击 
- 有限的展开总长度,以防止平方级爆炸 
- 防止检索外部实体和DTD的猴子补丁 
修改
pyexpat中的修改
解析器对象
新的解析器属性(读写)
- max_entity_indirections 
- max_entity_expansions 
- reset_dtd 
模块常量
- XML_DEFAULT_MAX_ENTITY_INDIRECTIONS 
- XML_DEFAULT_MAX_ENTITY_EXPANSIONS 
- XML_BOMB_PROTECTION 
模块函数
- get_reset_dtd(), set_reset_dtd(bool) 
- get_max_entity_expansions(), set_max_entity_expansions(int) 
- get_max_entity_indirections(), et_max_entity_indirections(int) 
新的CAPI成员
- capi.GetFeature 
- capi.SetFeature 
- capi.GetFeatureDefault 
- capi.SetFeatureDefault 
_elementtree扩展模块中的修改
_elementtree.XMLParser
新的参数和只读属性
- max_entity_indirections 
- max_entity_expansions 
- ignore_dtd 
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
- 在解析完块后重置所有DTD信息。当设置标志(默认:false)时,在调用endDoctypeDeclHandler之后,所有DTD信息将被重置。该标志可以在endDoctypeDeclHandler内部设置。如果没有DTD信息,文档体中的任何实体引用都会导致XML_ERROR_UNDEFINED_ENTITY。 - 支持范围
- 0, 1 
- 默认值
- 0 
 
需求
- Python 2.6.6或更高版本(对于随机哈希,2.6.8或更高版本) 
- Python 2.7(对于随机哈希和Windows二进制文件,2.7.3或更高版本) 
- Python 3.1(对于随机哈希和Windows二进制文件,3.1.5或更高版本) 
- Python 3.2(对于随机哈希和Windows二进制文件,3.2.3或更高版本) 
- Python 3.3.0或更高版本 
Windows二进制文件与2.6.6、2.7.3、3.1.5、3.2.3或3.3.0或更高微版本兼容。它们不支持旧版本。
许可证
版权(c)2013年Christian Heimes <christian@python.org>
根据贡献者协议许可PSF使用。
有关许可详细信息,请参阅https://pythonlang.cn/psf/license。
贡献者
- Antoine Pitrou
- 代码审查 
- Brett Cannon
- 代码审查 
变更日志
defusedexpat 0.4
发布日期:2013年2月25日
- 使代码源与没有哈希随机化的Python版本兼容。 
- 包含最新的expat补丁版本 
defusedexpat 0.3
发布日期:2013年2月19日
- 由于代理技巧不起作用,禁用Windows上的某些测试 
- 从CAPI MAGIC中删除“炸弹保护”后缀 
- 当XML_BOMB_PROTECTION不可用时,不支持_elementtree的额外kwargs。 
- 在expat中实现更好的、更灵活的get/set功能API 
- 添加模块函数以设置全局设置 
defusedexpat 0.2
发布日期:2013年2月15日
- Python 3.1支持 
- 其他修复和改进 
defusedexpat 0.1
发布日期:2013年2月11日
- PSRT审查的初始和内部发布 
项目详情
下载文件
下载适合您平台文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源代码分发
构建版本
defusedexpat-0.4.zip的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | f0185c81ef89879b6e40107d6e42b4175eaa812401eec79f18f3d88297822345 | |
| MD5 | d870a2eb4137d676df896719cdd52a55 | |
| BLAKE2b-256 | 2fcc56e82058fa3bfbe75b8601f91e0ed2b586fb6aef3105fc0ff734371971e3 | 
defusedexpat-0.4.tar.gz的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 43622e7fc95a55049a1b755d421cd1ef05e854609db0313cd826a3b873a6debd | |
| MD5 | 8091bb85a6842456a4b7fe842dc13f89 | |
| BLAKE2b-256 | c16b5885b434e95ebfa35b7c4fa48019c8c676f7475e01074da84e0840e521df |