非常教程

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

  1. xml.etree.ElementTree 不会扩展外部实体,并在实体出现时引发ParserError。
  1. xml.dom.minidom 不会扩展外部实体,只是简单地返回未扩展的实体。
  1. 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功能。

Python

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

Python目录

1.内置常量 | Built-in Constants
2.内置例外 | Built-in Exceptions
3.内置函数 | Built-in Functions
4.内置类型 | Built-in Types
5.编译器 | Compiler
6.加密 | Cryptography
7.数据压缩 | Data Compression
8.数据持久性 | Data Persistence
9.数据类型 | Data Types
10.调试和分析 | Debugging & Profiling
11.开发工具 | Development Tools
12.文件和目录访问 | File & Directory Access
13.文件格式 | File Formats
14.构架 | Frameworks
15.输入 | Importing
16.输入/输出 | Input/ouput
17.国际化 | Internationalization
18.网络 | Internet
19.网络数据 | Internet Data
20.翻译 | Interpreters
21.语言 | Language
22.记录 | Logging
23.Mac OS
24.MS Windows
25.多媒体 | Multimedia
26.联网 | Networking
27.数字与数学 | Numeric & Mathematical
28.操作系统 | Operating System
29.可选操作系统 | Optional Operating System
30.限制执行 | Restricted Execution
31.运行 | Runtime
32.SGI IRIX
33.软件包装与分销 | Software Packaging & Distribution
34.字符串 | String
35.结构化标记 | Structured Markup
36.Tk
37.Unix
38.Python 简介
39.Python pass 语句
40.Python 循环嵌套
41.Python 运算符
42.Python log10() 函数
43.Python log() 函数
44.Python floor() 函数
45.Python fabs() 函数
46.Python exp() 函数
47.Python cmp() 函数
48.Python ceil() 函数
49.Python abs() 函数
50.Python Number(数字)
51.Python pow() 函数
52.Python modf() 函数
53.Python min() 函数
54.Python max() 函数
55.Python asin() 函数
56.Python acos() 函数
57.Python uniform() 函数
58.Python shuffle() 函数
59.Python seed() 函数
60.Python random() 函数
61.Python randrange() 函数
62.Python choice() 函数
63.Python sqrt() 函数
64.Python round() 函数
65.Python radians() 函数
66.Python degrees() 函数
67.Python tan() 函数
68.Python sin() 函数
69.Python hypot() 函数
70.Python cos() 函数
71.Python atan2() 函数
72.Python atan() 函数
73.Python 元组
74.Python 列表(List)
75.Python 字符串
76.Python 字典(Dictionary)
77.Python 日期和时间
78.Python 函数
79.Python 模块
80.Python capitalize()方法
81.Python center()方法
82.Python count() 方法
83.Python expandtabs()方法
84.Python endswith()方法
85.Python encode()方法
86.Python decode()方法
87.Python find()方法
88.Python index()方法
89.Python 异常处理
90.Python isspace()方法
91.Python isnumeric()方法
92.Python islower()方法
93.Python isdigit()方法
94.Python isalpha()方法
95.Python isalnum()方法
96.Python isupper()方法
97.Python istitle()方法
98.Python min()方法
99.Python max()方法
100.Python maketrans()方法