保护XSLT注入

时间:2009-10-22 09:52:02

标签: c# .net xslt

我使用xsl tranform将xml文件转换为dotNet中的html。我将xml中的节点值转换为html标记内容和属性。

我使用.Net DOM操作编写xml,使用任意和可能的恶意文本设置节点的InnerText属性。 现在,恶意制作的输入字符串将使我的HTML不安全。例如,某些javascript可能来自用户并且在输出html中找到链接href属性的方式,这是不安全的。

问题很简单,在将文本分配给InnerText属性之前,我必须对文本进行哪些消毒(如果有的话)?我认为分配给InnerText而不是InnerXml会对文本进行所有必要的清理,但似乎并非如此。

我的变换是否必须具有任何特殊特性才能使其安全运行?我应该注意哪些.net特定警告?

谢谢!

2 个答案:

答案 0 :(得分:0)

在使用XSLT转换XML之前,您应该清理XML。您可能需要以下内容:

string encoded = HttpUtility.HtmlEncode("<script>alert('hi')</script>");
XmlElement node = xml.CreateElement("code");
node.InnerText = encoded;

Console.WriteLine(encoded);
Console.WriteLine(node.OuterXml);

有了这个,你就会得到

&lt;script&gt;alert('hi')&lt;/script&gt;

将此文本添加到节点后,您将获得

<code>&amp;lt;script&amp;gt;alert('hi')&amp;lt;/script&amp;gt;</code>

现在,如果你运行XSLT,这个编码的HTML不会在你的输出中引起任何问题。

答案 1 :(得分:0)

事实证明问题来自xsl本身,它使用了disable-output-escaping。如果没有它,Tranform本身将完成所有必要的编码。

如果必须使用disable-output-escaping,则必须为每个元素使用appriate encodeinf函数。标记内容的HtmlEncode,属性值的HtmlAttributeEncode和html属性值的UrlEncode(例如href)