我使用xsl tranform将xml文件转换为dotNet中的html。我将xml中的节点值转换为html标记内容和属性。
我使用.Net DOM操作编写xml,使用任意和可能的恶意文本设置节点的InnerText属性。 现在,恶意制作的输入字符串将使我的HTML不安全。例如,某些javascript可能来自用户并且在输出html中找到链接href属性的方式,这是不安全的。
问题很简单,在将文本分配给InnerText属性之前,我必须对文本进行哪些消毒(如果有的话)?我认为分配给InnerText而不是InnerXml会对文本进行所有必要的清理,但似乎并非如此。
我的变换是否必须具有任何特殊特性才能使其安全运行?我应该注意哪些.net特定警告?
谢谢!
答案 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);
有了这个,你就会得到
<script>alert('hi')</script>
将此文本添加到节点后,您将获得
<code>&lt;script&gt;alert('hi')&lt;/script&gt;</code>
现在,如果你运行XSLT,这个编码的HTML不会在你的输出中引起任何问题。
答案 1 :(得分:0)
事实证明问题来自xsl本身,它使用了disable-output-escaping。如果没有它,Tranform本身将完成所有必要的编码。
如果必须使用disable-output-escaping,则必须为每个元素使用appriate encodeinf函数。标记内容的HtmlEncode,属性值的HtmlAttributeEncode和html属性值的UrlEncode(例如href)