Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 防止XSLT注入_C#_.net_Xslt - Fatal编程技术网

C# 防止XSLT注入

C# 防止XSLT注入,c#,.net,xslt,C#,.net,Xslt,我在dotNet中使用xsl转换将xml文件转换为html。我将xml中的节点值转换为html标记内容和属性 我使用.NETDOM操作编写xml,将节点的InnerText属性设置为任意的、可能是恶意的文本。 现在,恶意创建的输入字符串将使我的html不安全。不安全的含义是,某些javascript可能来自用户,并在输出html中找到链接href属性,例如 问题很简单,在将文本分配给InnerText属性之前,我必须对文本进行哪些清理(如果有)?我认为分配给InnerText而不是InnerXm

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

我使用.NETDOM操作编写xml,将节点的InnerText属性设置为任意的、可能是恶意的文本。 现在,恶意创建的输入字符串将使我的html不安全。不安全的含义是,某些javascript可能来自用户,并在输出html中找到链接href属性,例如

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

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


谢谢

在使用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不会在您的输出中造成任何问题。

事实证明,问题来自xsl本身,它使用了禁用输出转义。没有这一点,Tranform本身将完成所有必要的编码


如果必须使用“禁用输出转义”,则必须对每个元素使用appriate encodeinf函数。用于标记内容的HtmlEncode、用于属性值的HTMLAttributeNCode和用于html属性值的UrlEncode(例如href)

如果只设置节点值而不是其内部文本,是否会得到相同的结果
HtmlEncode()
对我来说似乎是多余的。@Tomalak,主要思想是在添加文本之前对其进行编码(您将对其编码两次);要添加,可以使用.InnerText(如OP所述)或.ValueHum。。。为什么需要编码两次,一次在HtmlEncode中,一次在setting InnerText中;对它进行一次编码(另一次编码由XmlDocument完成)将完成这个技巧,基本上只需重复答案,而不添加任何信息。我怀疑关键在于“它在XSLT中变成了HTML”。这是否意味着我的恶意文本将在xml文件中正确编码,但在输出中将其用作html标记的内容时将被“解码”,因此我必须在将其写入InnerText属性之前对其进行html编码?