以下总结了在
.NET
中处理 XML 的常用方法和防止外部实体注入的措施
1. XDocument(不安全)
XDocument
是 LINQ to XML 的一部分,提供了更简洁的方式来处理 XML。示例:
XDocument xdoc = XDocument.Load("file.xml");
var elements = xdoc.Descendants("elementName").ToList();
无法防御XXE漏洞:无法禁止解析外部实体,最多只能使用LoadOptions.None
在加载时不应用任何特殊选项。
XDocument xdoc = XDocument.Load("file.xml", LoadOptions.None);
2. XmlDocument
XmlDocument
提供了一个 DOM(文档对象模型)来加载、修改和查询 XML 文档。示例:
XmlDocument doc = new XmlDocument();
doc.Load("file.xml");
XmlNodeList nodes = doc.GetElementsByTagName("elementName");
默认情况下,XmlDocument
并不防止外部实体的解析,容易受到 XXE 攻击。
防御措施:确保 XmlDocument
的 XmlResolver
属性被设置为 null
XmlDocument doc = new XmlDocument();
doc.XmlResolver = null; // 禁用外部解析
doc.Load("file.xml");
3. XmlReader
XmlReader
提供了一个快速、向前的方式读取 XML 数据,适合于只读操作。
默认情况下,是禁止处理外部实体的,但当XmlReaderSettings
类的ProhibitDtd
属性被设置为false
时,会受到XXE攻击的风险。如下代码
XmlReaderSettings rs = new XmlReaderSettings();
rs.ProhibitDtd = false;//风险代码位置
XmlReader myReader = XmlReader.Create(new StringReader(xml), rs);
while (myReader.Read()){
Response.Write(myReader.Value);
}
防御措施:
XmlReaderSettings settings = new XmlReaderSettings//XmlReader的配置项
{
DtdProcessing = DtdProcessing.Prohibit, // 禁用 DTD
XmlResolver = null // 禁用外部解析
};
using (XmlReader reader = XmlReader.Create("file.xml", settings))
{
// 读取 XML
}