在 ASP.NET-MVC3 中禁用 unicode 字符的编码

Soo*_*ead 5 encoding utf-8 asp.net-mvc-3

在我的网站上,每个文本都以 UTF-8 格式提供。

由于现在每个浏览器都支持 unicode 字符,我想按原样使用它们。

asp.net 框架通过将任何 unicode 替换为数字字符引用(如á. 参考检查:http : //en.wikipedia.org/wiki/Unicode_and_HTML#HTML_document_characters

当然,通过这种方式,网页可以在最古老的网景中正确呈现,但例如,谷歌分析电子商务模块在理解这些特殊编码的字符时遇到了一些麻烦。

有没有办法全局禁用数字字符引用编码?

例如我想用剃刀写:

<span class="title">@ViewBag.Title</span>
Run Code Online (Sandbox Code Playgroud)

我希望这显示在输出上:

<span class="title">Számítástechnika</span>
Run Code Online (Sandbox Code Playgroud)

不是这个:

<span class="title">Sz&#225;m&#237;t&#225;stechnika</span>
Run Code Online (Sandbox Code Playgroud)

我不是要禁用 html 编码,因此 Html.Raw 不是解决方案,例如我无法确保 @ViewBag.Title 不会满足以下内容:

<span class="title"><script>alert('injected hahahah');</script></span>
Run Code Online (Sandbox Code Playgroud)

所以我对特殊 html 字符的自动编码感到满意。那不是我想要禁用的。

我不想重组所有代码,我认为应该有一个“全局开关”来禁用在 razor 中使用字符串参数时的这种行为。有没有办法做到这一点?

我也可以明确禁止数字字符引用,例如像new MvcHtmlString(myString, some parameters)?

nem*_*esv 5

恐怕您无法关闭此编码功能。这个“不错的”功能是由 WebUtility.HtmlEncode 提供的您无法影响编码。

但是,从.net 4.0开始,您可以自定义编码行为,方法是创建一个继承自 web.cofig HttpRuntimeSection.EncoderType 的类HttpEncoder在 web.cofig HttpRuntimeSection.EncoderType 中对其进行配置。但您需要实现自己的自定义编码逻辑。

幸运的是,.net 4.5附带了一个新的编码器HttpEncoder,它可以对不好的东西(例如<script>)进行编码,但可以正确处理 Unicode 字符,称为AntiXssEncoder

所以你只需要将其添加到你的 web.config 中:

<system.web>
    <httpRuntime encoderType="System.Web.Security.AntiXss.AntiXssEncoder, 
                             System.Web, Version=4.0.0.0, Culture=neutral, 
                             PublicKeyToken=b03f5f7f11d50a3a"/>    
</system.web>
Run Code Online (Sandbox Code Playgroud)

如果您尚未使用 .net 4.5,您可以在Microsoft Web Protection LibraryAntiXssEncoder的帮助下 实现您的

这是一篇如何设置它的文章:Using AntiXss As The Default Encoder For ASP.NET(尽管它可能已经过时)