5

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

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

asp.net 框架通过将任何 unicode 替换为数字字符引用(如á. 参考检查: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 字符的自动编码很满意。这不是我想要禁用的。

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

我也可以明确禁止数字字符引用,例如使用类似的东西new MvcHtmlString(myString, some parameters)吗?

4

3 回答 3

4

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

但是,从.net 4.0开始,您可以自定义编码行为,方法是创建一个继承自 的类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>

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

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

于 2013-01-29T13:09:32.710 回答
3

您也可以使用@Html.Rawmvc 的方法。这在您不想在全局级别执行此操作时很有用,有时在已构建的项目中。

@Html.Raw(@ViewBag.Title)
于 2015-05-21T10:13:39.503 回答
1

对于 .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

于 2021-06-12T14:46:21.330 回答