XML處理模塊?
源碼: Lib/xml/
用于處理XML的Python接口分組在 xml
包中。
警告
XML 模塊對(duì)于錯(cuò)誤或惡意構(gòu)造的數(shù)據(jù)是不安全的。 如果你需要解析不受信任或未經(jīng)身份驗(yàn)證的數(shù)據(jù),請(qǐng)參閱 XML 漏洞 和 defusedxml 包 部分。
值得注意的是 xml
包中的模塊要求至少有一個(gè) SAX 兼容的 XML 解析器可用。在 Python 中包含 Expat 解析器,因此 xml.parsers.expat
模塊將始終可用。
xml.dom
和 xml.sax
包的文檔是 DOM 和 SAX 接口的 Python 綁定的定義。
XML 處理子模塊包括:
xml.etree.ElementTree
: ElementTree API,一個(gè)簡(jiǎn)單而輕量級(jí)的XML處理器
xml.dom
:DOM API 定義xml.dom.minidom
:最小的 DOM 實(shí)現(xiàn)xml.dom.pulldom
:支持構(gòu)建部分 DOM 樹
xml.sax
:SAX2 基類和便利函數(shù)xml.parsers.expat
:Expat解析器綁定
XML 漏洞?
XML 處理模塊對(duì)于惡意構(gòu)造的數(shù)據(jù)是不安全的。 攻擊者可能濫用 XML 功能來(lái)執(zhí)行拒絕服務(wù)攻擊、訪問(wèn)本地文件、生成與其它計(jì)算機(jī)的網(wǎng)絡(luò)連接或繞過(guò)防火墻。
下表概述了已知的攻擊以及各種模塊是否容易受到攻擊。
種類 |
sax |
etree |
minidom |
pulldom |
xmlrpc |
---|---|---|---|---|---|
billion laughs |
Vulnerable (1) |
Vulnerable (1) |
Vulnerable (1) |
Vulnerable (1) |
Vulnerable (1) |
quadratic blowup |
Vulnerable (1) |
Vulnerable (1) |
Vulnerable (1) |
Vulnerable (1) |
Vulnerable (1) |
external entity expansion |
Safe (5) |
Safe (2) |
Safe (3) |
Safe (5) |
安全 (4) |
DTD retrieval |
Safe (5) |
安全 |
安全 |
Safe (5) |
安全 |
decompression bomb |
安全 |
安全 |
安全 |
安全 |
易受攻擊 |
Expat 2.4.1 and newer is not vulnerable to the "billion laughs" and "quadratic blowup" vulnerabilities. Items still listed as vulnerable due to potential reliance on system-provided libraries. Check
pyexpat.EXPAT_VERSION
.xml.etree.ElementTree
不會(huì)擴(kuò)展外部實(shí)體并在實(shí)體發(fā)生時(shí)引發(fā)ParserError
。xml.dom.minidom
不會(huì)擴(kuò)展外部實(shí)體,只是簡(jiǎn)單地返回未擴(kuò)展的實(shí)體。xmlrpclib
不擴(kuò)展外部實(shí)體并省略它們。從 Python 3.7.1 開始,默認(rèn)情況下不再處理外部通用實(shí)體。
- billion laughs / exponential entity expansion (狂笑/遞歸實(shí)體擴(kuò)展)
Billion Laughs 攻擊 -- 也稱為遞歸實(shí)體擴(kuò)展 -- 使用多級(jí)嵌套實(shí)體。 每個(gè)實(shí)體多次引用另一個(gè)實(shí)體,最終實(shí)體定義包含一個(gè)小字符串。 指數(shù)級(jí)擴(kuò)展導(dǎo)致幾千 GB 的文本,并消耗大量?jī)?nèi)存和 CPU 時(shí)間。
- quadratic blowup entity expansion(二次爆炸實(shí)體擴(kuò)展)
二次爆炸攻擊類似于 Billion Laughs 攻擊,它也濫用實(shí)體擴(kuò)展。 它不是嵌套實(shí)體,而是一遍又一遍地重復(fù)一個(gè)具有幾千個(gè)字符的大型實(shí)體。攻擊不如遞歸情況有效,但它避免觸發(fā)禁止深度嵌套實(shí)體的解析器對(duì)策。
- external entity expansion
實(shí)體聲明可以包含的不僅僅是替換文本。 它們還可以指向外部資源或本地文件。 XML 解析器訪問(wèn)資源并將內(nèi)容嵌入到 XML 文檔中。
- DTD retrieval
Python 的一些 XML 庫(kù)
xml.dom.pulldom
從遠(yuǎn)程或本地位置檢索文檔類型定義。 該功能與外部實(shí)體擴(kuò)展問(wèn)題具有相似的含義。- decompression bomb
Decompression bombs(解壓炸彈,又名 ZIP bomb)適用于所有可以解析壓縮 XML 流(例如 gzip 壓縮的 HTTP 流或 LZMA 壓縮的文件)的 XML 庫(kù)。 對(duì)于攻擊者來(lái)說(shuō),它可以將傳輸?shù)臄?shù)據(jù)量減少三個(gè)量級(jí)或更多。
PyPI上 defusedxml 的文檔包含有關(guān)所有已知攻擊向量的更多信息以及示例和參考。
defusedxml
包?
defusedxml 是一個(gè)純 Python 軟件包,它修改了所有標(biāo)準(zhǔn)庫(kù) XML 解析器的子類,可以防止任何潛在的惡意操作。 對(duì)于解析不受信任的XML數(shù)據(jù)的任何服務(wù)器代碼,建議使用此程序包。 該軟件包還提供了有關(guān)更多 XML 漏洞(如 XPath 注入)的示例漏洞和擴(kuò)展文檔。