# XML 處理模組

原始碼： Lib/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 剖析器繫結

This module also defines utility functions.

xml.is_valid_name(name)

  Return `True` if the string is a valid element or attribute name, `False` otherwise.

  Almost all characters are permitted in names, except control characters and those which either are or reasonably could be used as delimiters. Characters like ":", "-", ".", "_", and "·" are permitted, but "<", "/", "!", "?", and "=" are forbidden. The name cannot start with a digit or a character like "-", ".", and "·".

  在 3.15 版被加入.

xml.is_valid_text(data)

  Return `True` if the string is a sequence of legal XML 1.0 characters, `False` otherwise.

  Almost all characters are permitted in XML 1.0 documents, except C0 control characters (excluding TAB, CR and LF), surrogate characters and special Unicode characters U+FFFE and U+FFFF.

  在 3.15 版被加入.

## XML 安全性

攻擊者可以濫用 XML 功能來執行阻斷服務攻擊 (denial of service attack)、存取本地檔案、生成與其他機器的網路連接或繞過防火牆，無論由攻擊者控制的 XML 是在 Python 中還是其他地方被剖析。

The built-in XML parsers of Python rely on the library libexpat, commonly called Expat, for parsing XML.

By default, Expat itself does not access local files or create network connections.

Expat versions lower than 2.7.2 may be vulnerable to the "billion laughs", "quadratic blowup" and "large tokens" vulnerabilities, or to disproportional use of dynamic memory. Python bundles a copy of Expat, and whether Python uses the bundled or a system-wide Expat, depends on how the Python interpreter `has been configured` in your environment. Python may be vulnerable if it uses such older versions of Expat. Check `pyexpat.EXPAT_VERSION`.

`xmlrpc` 容易受到「解壓縮炸彈」攻擊。

十億笑聲 / 指數實體擴展

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

二次爆炸實體擴展

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

解壓縮炸彈 (decompression bomb)

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

大型 token

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