XML 注入¶
ID: cs/xml-injection
Kind: path-problem
Security severity: 8.8
Severity: error
Precision: high
Tags:
- security
- external/cwe/cwe-091
Query suites:
- csharp-code-scanning.qls
- csharp-security-extended.qls
- csharp-security-and-quality.qls
.NET 库提供的用于 XML 操作的 API 允许在 XML 文档中的指定点插入“原始”文本。如果将用户输入传递给此 API,则可能允许恶意用户添加可能会破坏或替换现有内容的额外内容,或启用意外的附加功能。
建议¶
避免对用户输入使用 System.Xml.XmlWriter
上的 WriteRaw
方法。如果可能,请使用高级 API 将新的 XML 元素写入文档,因为这些 API 会自动转义用户内容。如果无法做到这一点,则应在将用户输入包含在将与 WriteRaw
API 一起使用的字符串中之前对其进行转义。
示例¶
在此示例中,提供了描述要添加到表示一组姓名的 XML 文档中的员工姓名的用户输入。 WriteRaw
API 用于将新的员工记录写入 XML 文件。
using System;
using System.Security;
using System.Web;
using System.Xml;
public class XMLInjectionHandler : IHttpHandler {
public void ProcessRequest(HttpContext ctx) {
string employeeName = ctx.Request.QueryString["employeeName"];
using (XmlWriter writer = XmlWriter.Create("employees.xml"))
{
writer.WriteStartDocument();
// BAD: Insert user input directly into XML
writer.WriteRaw("<employee><name>" + employeeName + "</name></employee>");
writer.WriteEndElement();
writer.WriteEndDocument();
}
}
}
但是,如果恶意用户提供内容 Bobby Pages</name></employee><employee><name>Hacker1
,他们将能够在 XML 文件中添加一个额外的条目。
更正后的版本演示了两种避免此问题的方法。第一种方法是在将用户输入传递给 WriteRaw
API 之前对其进行转义,这可以防止恶意用户关闭或打开 XML 标记。第二种方法是使用高级 XML API 添加 XML 元素,这可以确保对内容进行适当的转义。
using System;
using System.Security;
using System.Web;
using System.Xml;
public class XMLInjectionHandler : IHttpHandler {
public void ProcessRequest(HttpContext ctx) {
string employeeName = ctx.Request.QueryString["employeeName"];
using (XmlWriter writer = XmlWriter.Create("employees.xml"))
{
writer.WriteStartDocument();
// GOOD: Escape user input before inserting into string
writer.WriteRaw("<employee><name>" + SecurityElement.Escape(employeeName) + "</name></employee>");
// GOOD: Use standard API, which automatically encodes values
writer.WriteStartElement("Employee");
writer.WriteElementString("Name", employeeName);
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndDocument();
}
}