# 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 blowup) | 脆弱 (1) | 脆弱 (1) | 脆弱 (1) | 脆弱 (1) | 脆弱 (1)
外部實體擴展 (external entity expansion) | 安全 (5) | 安全 (2) | 安全 (3) | 安全 (5) | 安全 (4)
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 注入）的範例和延伸文件。