web.config中的AntiXssEncoder会混淆默认编码方案

时间:2014-01-21 20:37:17

标签: c# asp.net-mvc character-encoding

我已经设置了一个基本的MVC 4应用程序,以便在每个旧instructions的web.config中使用AntiXssEncoder。当我这样做时,虽然通常编码的应用程序字符不再正确编码。

无论如何都要在web.config中纠正这种不可接受的行为,或者这个库刚刚坏了吗?

<httpRuntime targetFramework="4.5" encoderType="System.Web.Security.AntiXss.AntiXssEncoder,System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

MVC4默认web.config: 这表现出预期的行为

<table>
    <tr>
        <td>No encoding</td>
        <td>Inside Microsoft&#174; SharePoint&#174; 2013</td>
    </tr>
    <tr>
        <td>HttpUtility.HtmlEncode("Inside Microsoft® SharePoint® 2013")</td>
        <td>Inside Microsoft&amp;#174; SharePoint&amp;#174; 2013</td> <!-- double encoded, expected result -->
    </tr>
    <tr>
        <td>AntiXssEncoder.HtmlEncode("Inside Microsoft® SharePoint® 2013")</td>
        <td>Inside Microsoft&#174; SharePoint&#174; 2013</td><!-- manual call to encode, expected result -->
    </tr>
</table>

web.config中的AntiXssEncoder设置: 这是 NOT 预期的行为。没有任何版权符号被正确编码。

<table>
    <tr>
        <td>No encoding</td>
        <td>Inside Microsoft® SharePoint® 2013</td>
    </tr>
    <tr>
        <td>HttpUtility.HtmlEncode("Inside Microsoft® SharePoint® 2013")</td>
        <td>Inside Microsoft® SharePoint® 2013</td>
    </tr>
    <tr>
        <td>AntiXssEncoder.HtmlEncode("Inside Microsoft® SharePoint® 2013")</td>
        <td>Inside Microsoft® SharePoint® 2013</td>
    </tr>
</table>

源代码参考:

<table>
    <tr>
        <td>No encoding</td>
        <td>@data</td>
    </tr>
    <tr>
        <td>HttpUtility.HtmlEncode("Inside Microsoft® SharePoint® 2013")</td>
        <td>@HttpUtility.HtmlEncode(data)</td>
    </tr>
    <tr>
        <td>AntiXssEncoder.HtmlEncode("Inside Microsoft® SharePoint® 2013")</td>
        <td>@System.Web.Security.AntiXss.AntiXssEncoder.HtmlEncode(data, false)</td>
    </tr>
</table>

2 个答案:

答案 0 :(得分:0)

我无法找到AntiXssEncoder.HtmlEncode()只有字符串作为参数的旧资源。无论如何看MSDN - AntiXssEncoder.HtmlEncode(string,boolean),你得到的结果都是预期的。

注册商标字符是安全字符(C1 Controls and Latin-1 Supplement)的一部分,因此不会被编码。

如果您为useNamedEntities参数调用方法传递true,则注册商标将转换为&amp; REG;

您可以参考下面的代码 - 也可以参考.Net Fiddle

using System;
using System.Web;
using System.Web.Security.AntiXss;

public class Program
{
    public static void Main()
    {
        string data = "Inside Microsoft® SharePoint® 2013";

        Console.WriteLine(" -- HttpUtility.HtmlEncode(data) --");
        Console.WriteLine(HttpUtility.HtmlEncode(data));

        Console.WriteLine(" -- AntiXssEncoder.HtmlEncode(data, false) --");
        Console.WriteLine(AntiXssEncoder.HtmlEncode(data, false));

        Console.WriteLine(" -- AntiXssEncoder.HtmlEncode(data, true) --");
        Console.WriteLine(AntiXssEncoder.HtmlEncode(data, true));
    }
}

答案 1 :(得分:0)

HTML 字符在 MVC Razorview 中自动编码。 对于带有 @ 前缀的参数,您无需显式调用 HTMLencoder。