编码的字符无法正确呈现

时间:2015-12-14 14:02:40

标签: c# asp.net encoding webforms xss

我使用HttpUtility.HtmlEncode的简写来编码进入我的文本框的数据。

<asp:TextBox ID="txtProperty" runat="server" Text='<%#: Bind("Property")%>'></asp:TextBox>

我对编码字符行为的理解是,当您的Web浏览器呈现它们时,它们应显示为它们所代表的字符,而不是实际编码的字符。正如MSDN网站上的example code所示。

但是我编码的字符不会这样。

例如,从数据库中检索“£”字符,在文本框中显示为:

£ symbol rendering incorrectly

而不是:

£ symbol rendering correctly

我认为这与我的网站配置处理编码的方式无关,因为如果我手动将文本设置为HTML中的编码字符:

<asp:TextBox ID="txtProperty" runat="server" Text="&#163;"></asp:TextBox>

它将编码的字符正确呈现为:

£ symbol rendering correctly

这向我表明我使用HtmlEncode的方式存在问题。

我仍尝试在我的webconfig中明确地将编码设置为UTF-8,但没有区别。

有人可以解释这种行为,或者这可能是什么问题?

1 个答案:

答案 0 :(得分:3)

当你<%#: Bind("Property")%>时,ASP.NET已经开始对字符串进行HTML编码,如果你对它进行预编码,你就会陷入双重编码的情况。

参见ScottGu&#39; New <%: %> Syntax for HTML Encoding Output in ASP.NET 4 (and ASP.NET MVC 2)

  

ASP.NET 4引入了一个新的IHtmlString接口(以及一个具体的实现:HtmlString),您可以在类型上实现它以指示其值已经正确编码(或以其他方式检查)以显示为HTML,因此值不应再次进行HTML编码。

     

&lt;%:%&gt; code-nugget语法检查是否存在IHtmlString接口,如果其值实现此接口,则不会对代码表达式的输出进行HTML编码。

     

这允许开发人员避免必须根据具体情况决定是否使用&lt;%=%&gt;或&lt;%:%&gt;代码金块。

     

相反,您可以随时使用&lt;%:%&gt;代码块,然后让任何已经HTML编码的属性或数据类型实现IHtmlString接口。