XML 處理模組
************

**原始碼：**Lib/xml/

======================================================================

Python 處理 XML 的介面被歸類於 "xml" 套件中。

警告:

  XML 模組無法抵禦錯誤或惡意建構的資料。如果你需要剖析不受信任或未經身
  份驗證的資料，請參閱 XML 漏洞 和 defusedxml 套件 段落。

請務必注意 "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 處理模組無法抵禦惡意建構的資料。攻擊者可以濫用 XML 功能來執行阻斷
服務攻擊 (denial of service attack)、存取本地檔案、生成與其他機器的網
路連接或繞過防火牆。

下表概述了已知的攻擊以及各個模組是否易有漏洞。

+---------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
| 種類                      | sax                | etree              | minidom            | pulldom            | xmlrpc             |
|===========================|====================|====================|====================|====================|====================|
| 十億笑聲 (billion laughs) | **脆弱** (1)       | **脆弱** (1)       | **脆弱** (1)       | **脆弱** (1)       | **脆弱** (1)       |
+---------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
| 二次爆炸 (quadratic       | **脆弱** (1)       | **脆弱** (1)       | **脆弱** (1)       | **脆弱** (1)       | **脆弱** (1)       |
| blowup)                   |                    |                    |                    |                    |                    |
+---------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
| 外部實體擴展 (external    | 安全 (5)           | 安全 (2)           | 安全 (3)           | 安全 (5)           | 安全 (4)           |
| entity expansion)         |                    |                    |                    |                    |                    |
+---------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
| DTD 檢索                  | 安全 (5)           | 安全               | 安全               | 安全 (5)           | 安全               |
+---------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
| 解壓縮炸彈 (decompression | 安全               | 安全               | 安全               | 安全               | **脆弱**           |
| bomb)                     |                    |                    |                    |                    |                    |
+---------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+
| 大型 token                | **脆弱** (6)       | **脆弱** (6)       | **脆弱** (6)       | **脆弱** (6)       | **脆弱** (6)       |
+---------------------------+--------------------+--------------------+--------------------+--------------------+--------------------+

1. Expat 2.4.1 及更新的版本不易受到「十億笑聲」和「二次爆炸」漏洞的影
   響。但仍可能由於依賴系統提供的函式庫而被列為易受攻擊的項目。請檢查
   "pyexpat.EXPAT_VERSION"。

2. "xml.etree.ElementTree" 不會擴展外部實體，並在實體出現時引發
   "ParseError"。

3. "xml.dom.minidom" 不會擴展外部實體，只會逐字回傳未擴展的實體。

4. "xmlrpc.client" 不會擴展外部實體且會忽略它們。

5. 從 Python 3.7.1 開始，預設情況下不再處理外部通用實體。

6. Expat 2.6.0 及更新版本不易受到剖析大型 token 所導致的二次 runtime
   阻斷服務的影響。由於可能依賴系統提供的函式庫，因此仍被列為易受攻擊
   的項目。請參考 "pyexpat.EXPAT_VERSION"。

十億笑聲 / 指數實體擴展
   十億笑聲攻擊（也稱為指數實體擴展 (exponential entity expansion)）使
   用多層巢狀實體。每個實體多次引用另一個實體，最終的實體定義包含一個
   小字串。指數擴展會產生數 GB 的文本，並消耗大量記憶體和 CPU 時間。

二次爆炸實體擴展
   二次爆炸攻擊類似於十億笑聲攻擊；它也濫用實體擴展。它不是巢狀實體，
   而是一遍又一遍地重複一個具有幾千個字元的大型實體。該攻擊不如指數擴
   展那麼有效率，但它不會觸發那些用來防止深度巢狀實體的剖析器對策。

外部實體擴展 (external entity expansion)
   實體聲明不僅僅可以包含用於替換的文本，它們還可以指向外部資源或本地
   檔案。XML 剖析器會存取資源並將內容嵌入到 XML 文件中。

DTD 檢索
   一些 XML 函式庫（例如 Python 的 "xml.dom.pulldom"）從遠端或本地位置
   檢索文件類型定義。該功能與外部實體擴展問題具有類似的含義。

解壓縮炸彈 (decompression bomb)
   解壓縮炸彈（又名 ZIP bomb）適用於所有可以剖析壓縮 XML 串流（例如
   gzip 壓縮的 HTTP 串流或 LZMA 壓縮檔案）的 XML 函式庫。對於攻擊者來
   說，它可以將傳輸的資料量減少三個或更多數量級。

大型 token
   Expat 需要重新剖析未完成的 token；如果沒有 Expat 2.6.0 中引入的保護
   ，這可能會導致二次 runtime 而導致剖析 XML 的應用程式出現阻斷服務。
   此問題記錄於 CVE-2023-52425。

PyPI 上的 defusedxml 文件包含有關所有已知攻擊媒介 (attack vector) 的更
多資訊以及範例和參考資料。


"defusedxml" 套件
=================

defusedxml 是一個純 Python 套件，其中包含所有標準函式庫中 XML 剖析器的
修正版本子類別，可防止任何潛在的惡意操作。當伺服器程式會剖析任何不受信
任的 XML 資料時建議使用此套件。該套件還附帶了更多有關 XML 漏洞（例如
XPath 注入）的範例和延伸文件。
