源碼: Lib/xml/
用於處理XML的Python接口分組在 xml 包中。
警告:XML 模塊對於錯誤或惡意構造的數據是不安全的。 如果需要解析不受信任或未經身份驗證的數據,請參閱 XML 漏洞 和 defusedxml 和 defusedexpat 軟件包 部分。
值得注意的是 xml 包中的模塊要求至少有一個 SAX 兼容的 XML 解析器可用。在 Pythonm中包含 Expat 解析器,因此 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 功能來執行拒絕服務攻擊、訪問本地文件、生成與其它計算機的網絡連接或繞過防火牆。
下表概述了已知的攻擊以及各種模塊是否容易受到攻擊。
種類 |
sax |
etree |
minidom |
pulldom |
xmlrpc |
billion laughs |
易受攻擊 |
易受攻擊 |
易受攻擊 |
易受攻擊 |
易受攻擊 |
quadratic blowup |
易受攻擊 |
易受攻擊 |
易受攻擊 |
易受攻擊 |
易受攻擊 |
external entity expansion |
安全 (4) |
安全 (1) |
安全 (2) |
安全 (4) |
安全 (3) |
DTD retrieval |
安全 (4) |
安全 |
安全 |
安全 (4) |
安全 |
decompression bomb |
安全 |
安全 |
安全 |
安全 |
易受攻擊 |
-
xml.etree.ElementTree 不會擴展外部實體並在實體發生時引發 ParserError。
-
xml.dom.minidom 不會擴展外部實體,只是簡單地返回未擴展的實體。
-
xmlrpclib 不擴展外部實體並省略它們。
-
Since Python 3.8.0, external general entities are no longer processed by default since Python.
billion laughs / exponential entity expansion (狂笑/遞歸實體擴展)
Billion Laughs 攻擊 – 也稱爲遞歸實體擴展 – 使用多級嵌套實體。 每個實體多次引用另一個實體,最終實體定義包含一個小字符串。 指數級擴展導致幾千 GB 的文本,並消耗大量內存和 CPU 時間。
quadratic blowup entity expansion(二次爆炸實體擴展)
二次爆炸攻擊類似於 Billion Laughs 攻擊,它也濫用實體擴展。 它不是嵌套實體,而是一遍又一遍地重複一個具有幾千個字符的大型實體。攻擊不如遞歸情況有效,但它避免觸發禁止深度嵌套實體的解析器對策。
external entity expansion
實體聲明可以包含的不僅僅是替換文本。 它們還可以指向外部資源或本地文件。 XML 解析器訪問資源並將內容嵌入到 XML 文檔中。
DTD retrieval
Python 的一些 XML 庫 xml.dom.pulldom 從遠程或本地位置檢索文檔類型定義。 該功能與外部實體擴展問題具有相似的含義。
decompression bomb
Decompression bombs(解壓炸彈,又名 ZIP bomb)適用於所有可以解析壓縮 XML 流(例如 gzip 壓縮的 HTTP 流或 LZMA 壓縮的文件)的 XML 庫。 對於攻擊者來說,它可以將傳輸的數據量減少三個量級或更多。
PyPI上 defusedxml 的文檔包含有關所有已知攻擊向量的更多信息以及示例和參考。
defusedxml 和 defusedexpat 軟件包
defusedxml 是一個純 Python 軟件包,它修改了所有標準庫 XML 解析器的子類,可以防止任何潛在的惡意操作。 對於解析不受信任的XML數據的任何服務器代碼,建議使用此程序包。 該軟件包還提供了有關更多 XML 漏洞(如 XPath 注入)的示例漏洞和擴展文檔。
defusedexpat 提供了一個修改過的 libexpat 和一個打過補丁的 pyexpat 模塊,它有針對實體擴展DoS攻擊的對策。 defusedexpat 模塊仍然允許合理且可配置的實體擴展量。 這些修改可能包含在 Python 的某些未來版本中,但不會包含在 Python 的任何修復版本中,因爲它們會破壞向後兼容性。