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

时间:2013-01-29 10:33:35

标签: asp.net-mvc-3 encoding utf-8

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

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

通过使用数字字符引用替换任何unicode(例如á),asp.net框架非常有用。供参考检查:http://en.wikipedia.org/wiki/Unicode_and_HTML#HTML_document_characters

当然,这样网页可以在最早的网景中正确呈现,但是例如谷歌分析电子商务模块在理解这些特殊编码字符时会遇到一些麻烦。

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

例如我想用剃须刀写作:

<span class="title">@ViewBag.Title</span>

我希望在输出中显示:

<span class="title">Számítástechnika</span>

不是这个:

<span class="title">Sz&#225;m&#237;t&#225;stechnika</span>

我不是要禁用html编码,所以Html.Raw不是解决方案,例如我无法确保@ ViewBag.Title不会包含这样的内容:

<span class="title"><script>alert('injected hahahah');</script></span>

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

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

我也可以明确禁止数字字符引用,例如new MvcHtmlString(myString, some parameters)之类的内容吗?

3 个答案:

答案 0 :(得分:4)

我担心您无法关闭此编码功能。这个“漂亮”的功能由WebUtility.HtmlEncode提供,您无法影响编码。

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

幸运的是, .net 4.5 附带了一个新的HttpEncoder来编码坏内容(例如<script>)但是会正确处理名为AntiXssEncoder的Unicode字符

所以你只需要在web.config中添加它:

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

如果您尚未使用.net 4.5,则可以在帮助下实施AntiXssEncoder Microsoft Web Protection Library

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

答案 1 :(得分:0)

你也可以使用mvc的@Html.Raw方法。这对于你不想在全球范围内有时在已经建成的项目上进行的方法非常有用。

@Html.Raw(@ViewBag.Title)

答案 2 :(得分:0)

对于 .Net Core Web 应用程序,您可以在 ConfigureServices 方法中配置默认​​编码行为:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<WebEncoderOptions>(options => 
            {
                options.TextEncoderSettings = new TextEncoderSettings(UnicodeRanges.All);
            });
}

这将在 html 页面上呈现非编码的 unicode 字符。 来源https://github.com/aspnet/HttpAbstractions/issues/315