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

时间:2017-11-03 21:07:34

标签: python xml security elementtree

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

但是,the Python 3 documentation包含以下警告:

  

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

我曾计划使用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")

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

1 个答案:

答案 0 :(得分:3)

根据Python文档的20.4.1. XML vulnerabilities部分,xml.etree.ElementTree容易受到 Billion Laughs攻击二次爆炸攻击的攻击。

  

亿笑/指数实体扩张

     

Billion Laughs攻击 - 也称为指数实体扩展 - 使用多级嵌套实体。每个实体多次引用另一个实体,最终实体定义包含一个小字符串。指数级扩展导致几千兆字节的文本,并消耗大量内存和CPU时间。

     

二次爆炸实体扩张

     

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

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

相关问题