为什么 xml.etree.ElementTree 被认为不安全?

Ste*_*ica 4 python xml security elementtree

根据使用 python 创建简单的 XML 文件,在 Python 中生成 XML 文件的最简单方法之一是使用 Python 的内置 ElementTree XML API。

但是,Python 3 文档包含以下警告:

警告:xml.etree.ElementTree模块无法抵御恶意构建的数据。如果您需要解析不受信任或未经身份验证的数据,请参阅XML 漏洞

我曾计划使用 ElementTree 库通过用户输入的属性值构建 XML 请求。但是,我现在担心我的应用程序的安全性。

例如,我的应用程序有一个logon()函数,其中包含用户输入的用户名和密码的参数。然后,这些值将用作 XML 属性。

import xml.etree.ElementTree as ET

def logon(username, password):
    # Create XML logon request for external webservice
    root = ET.Element("xml")
    body = ET.SubElement(root, "Logon")
    body.set("Username", username)
    body.set("Password", password)

    return ET.tostring(root, encoding="UTF-8", method="xml")
Run Code Online (Sandbox Code Playgroud)

为什么被xml.etree.ElementTree认为是不安全的?使用用户定义的 XML 属性值是否安全?

Ort*_*kni 5

根据第20.4.1 节。Python 文档的XML 漏洞xml.etree.ElementTree容易受到Billion Laughs 攻击和二次爆炸攻击

\n
\n

十亿笑声/指数实体扩张

\n

Billion Laughs 攻击 \xe2\x80\x93 也称为指数实体扩展 \xe2\x80\x93 使用多层嵌套实体。每个实体多次引用另一个实体,最终的实体定义包含一个小字符串。指数扩展会产生数 GB 的文本,并消耗大量内存和 CPU 时间。

\n

二次爆炸实体展开

\n

二次爆炸攻击类似于十亿笑攻击;它也滥用实体扩展。它不是嵌套实体,而是一遍又一遍地重复一个具有几千个字符的大型实体。该攻击的效率不如指数情况那么高,但它避免了触发禁止深层嵌套实体的解析器对策。

\n
\n

只要您不解析恶意制作的 XML,您就是安全的。

\n