ASP.NET Core View 中文變 & # x4E2D; & # x6587;

發現 ASP.NET Core 有個特性造成困擾。

我們都知道在 cshtml 以 @textFromServerSide 嵌入字串時,預設會被 HtmlEncode 以防止 Cross-Site Scripting 攻擊,如要將字串視為 HTML 標籤處理需額外呼叫 Html.Raw()。但在 ASP.NET Core 裡,結果跟我原本想像不同,例如以下 cshtml,表面上看來正常,中文正常顯示:

@{
    Layout = null;
}
<html>
<body>
    <div>
        Chinese Text = @("<b>中文測試</b>")
    </div>
</body>
</html>

檢視網頁原始碼卻讓我大吃一驚,中文字元都被轉成 &#xhhhh; 形式! 若以 UTF-8 編碼計算,每個中文字元由 3 Bytes 變成 8 Bytes 增肥近三倍,而更令人困擾的一點,原始碼裡的中文字消失讓網頁偵錯難度驟升好幾個等級。

爬文找到解法,Prevent Cross-Site Scripting (XSS) in ASP.NET Core - Microsoft Docs 文件提到 ASP.NET Core 的 TagHelper 及 HtmlHelper 預設會將所有非拉丁字元都當成特殊符號進行編碼,但此一設計對中文、西里爾文(斯拉夫語族)網頁開發者很不友善。所幸這個行為可透過設定調整,前幾天談 UrlEncode 時提到 .NET Core 新推出的 System.Text.Encodings.Web.HthmlEncoder 就用在這裡。而修改方法為在 Startup.cs ConfigureServices() 加入以下程式片段,將 ASP.NET Core cshtml 透過 DI 取得的 HtmlEcoder 換成我們的自訂版本:

services.AddSingleton<HtmlEncoder>(HtmlEncoder.Create(allowedRanges: new[] { UnicodeRanges.BasicLatin,     UnicodeRanges.CjkUnifiedIdeographs }));

自訂版 HtmlEcoder 將基本拉丁字元與中日韓字元納入允許範圍不做轉碼。

經過這番手腳,網頁原始碼總算清爽多了,阿彌陀佛~

歡迎推文分享:
Published 10 September 2018 10:34 PM 由 Jeffrey
Filed under: ,
Views: 2,327



意見

沒有意見

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<September 2018>
SunMonTueWedThuFriSat
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication