根据 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属性值是否安全?
答案 0 :(得分:3)
根据Python文档的20.4.1. XML vulnerabilities部分,xml.etree.ElementTree容易受到 Billion Laughs攻击和二次爆炸攻击的攻击。
亿笑/指数实体扩张
Billion Laughs攻击 - 也称为指数实体扩展 - 使用多级嵌套实体。每个实体多次引用另一个实体,最终实体定义包含一个小字符串。指数级扩展导致几千兆字节的文本,并消耗大量内存和CPU时间。
二次爆炸实体扩张
二次爆炸攻击类似于Billion Laughs攻击;它也滥用实体扩张。它不是嵌套实体,而是一遍又一遍地重复一个具有几千个字符的大型实体。攻击不如指数情况有效,但它避免触发禁止深层嵌套实体的解析器对策。
只要您不解析恶意制作的XML,就是安全的。