python3從零學習-5.9.2、XML處理模塊

源碼: 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

安全

安全

安全

安全

易受攻擊

  1. xml.etree.ElementTree 不會擴展外部實體並在實體發生時引發 ParserError。

  2. xml.dom.minidom 不會擴展外部實體,只是簡單地返回未擴展的實體。

  3. xmlrpclib 不擴展外部實體並省略它們。

  4. 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 的任何修復版本中,因爲它們會破壞向後兼容性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章