2009-10-22 64 views
1

我使用xsl转换将xml文件转换为html中的dotNet。我将xml中的节点值转换为html标签的内容和属性。保护XSLT注入

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

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

我的转换是否必须具有任何特殊的特性才能使其安全工作?任何.net特定的警告,我应该知道?

谢谢!

回答

0

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

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

0

在使用XSLT进行转换之前,您应该对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不会在您的输出中造成任何问题。

+0

如果您只是简单地设置节点值而不是内部文本,您不会得到同样的结果吗? 'HtmlEncode()'对我来说似乎是多余的。 – Tomalak

+0

@Tomalak,主要想法是在添加文本之前对它进行编码(您将对它进行两次编码);添加,你可以使用.InnerText(如OP说)或。值 –

+0

哼...为什么需要编码两次,一次在HtmlEncode和一次在设置InnerText? –