

網頁內嵌 JSON 注意事項
source link: https://blog.darkthread.net/blog/escape-script-in-json/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

網頁內嵌 JSON 注意事項
2021-01-07 08:29 PM 0 2,468在輸出網頁時內嵌 JSON 轉成 JavaScript 物件是我愛用的手法,這點之前有介紹過,例如以下範例:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
<script>
var DataItem = @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(ViewBag.DataItem));
</script>
</head>
<body>
<div>
</div>
</body>
</html>
不需額外寫程式,C# 端 DataItem 物件直接就轉成 JavaScript,簡潔方便,看起來沒什麼問題。
但以上寫法不夠嚴謹,讓我們動點手腳搞壞它:
public class HomeController : Controller
{
public ActionResult Index()
{
var item = new
{
Index = 255,
Name = "BOOM!!! </script>",
};
ViewBag.DataItem = item;
return View();
}
}
轟! JSON 中出現 &lgt;/script> 與上方的 &lgt;script> 配對成功,提前結束 script 區塊,JavaScript 程式不完整噴出錯誤,後方的程式碼混進 HTML 造成網頁錯亂:(提醒:若 JSON 內容由使用者輸入且未過濾 HTML 標籤,將存在被 XSS 攻擊的風險,請務必修正。另外,使用 Html.Raw() 時千萬要謹慎。)
寫過 Inline ASPX 的老人們都知道要避開這個雷(像是這篇文章出現的Response.Write("<script>parent.showMsg('" + msg + "');<" + "/script>");
),在 <script> 內嵌內容時 JSON 卻容易疏忽。Json.NET 有個 Newtonsoft.Json.StringEscapeHandling.EscapeHtml 參數,在 SerializeObject() 時傳入 JsonSerializerSettings 指定 StringEscapeHandling = StringEscapeHandling.EscapeHtml 即可輕易解決。
<script>
var DataItem = @Html.Raw(
Newtonsoft.Json.JsonConvert.SerializeObject(ViewBag.DataItem,
new Newtonsoft.Json.JsonSerializerSettings
{
StringEscapeHandling = Newtonsoft.Json.StringEscapeHandling.EscapeHtml
}));
</script>
啟用 StringEscapeHandling.EscapeHtml 後,< > 將被轉碼為 \u003c、\u003e,可避免字串內含 HTML 標籤干擾網頁解析。
如果無特殊需求,建議直接修改 JsonConvert.DefaultSettings 讓 Json.NET 預設啟用 EscapeHtml,做法可在 Global.asax.cs 或 App_Start 類別方法修改預設值,如此可避免忘記調設定出錯:
JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
StringEscapeHandling = Newtonsoft.Json.StringEscapeHandling.EscapeHtml
};
最後,順便看一下 ASP.NET Core。ASP.NET Core 預設已改用 System.Text.Json,官方文件有提到 System.Text.Json 原本就會換掉特殊字 字(甚至包含中文),這點之前我已見識過 - ASP.NET Core JSON 中文編碼問題與序列化參數設定,只要不要亂設 JsonSerializerOptions.Encoder (例如:JavaScriptEncoder.UnsafeRelaxedJsonEscaping),應不致遇到問題。
Recommend
-
5
Go 語言 Select Multiple Channel 注意事項
-
5
February 6, 2021 ...
-
9
AppDomain.AssemblyResolve 內嵌 DLL 成單一 EXE 檔注意事項-黑暗執行緒開發小工具時,把相依的 DLL 包進單一 EXE 是很有用的技巧,如此使用者只需複製單一檔案到特定目錄或桌面便能執行,省去跑安裝程式或建立資料夾放入 EXE + DLL 的麻煩。 要達成這個...
-
6
使用新版 AzCopy v10 的注意事項與使用教學最近在使用 AzCopy 的時候,發現怎麼跟以前差這麼多,這才發現原來最近出現了大改版,命令列的參數都跟以往不一樣了。這個新版改變蠻大的,我覺得對一個用過舊版的人來說,改用新版的第一印象真的不太好,研究的過程中...
-
10
PowerShell ConvertTo-Json 複雜巢狀結構注意事項-黑暗執行緒 ConvertTo-Json/ConvertFrom-Json 是少數我用不順手的 PowerShell 指令,過去就踩過幾次雷(ConvertFrom-JSON 解析大型...
-
5
最近有專案需要在報表上顯示 Code 128 條碼,但負責這個功能的開發人員會遇到特定文字產生的條碼無法被掃描/辨識的問題。由於我之前沒有親手處理過 Code 128 條碼,所以藉此研究了一下 Code 128 條碼的產...
-
7
.NET 6 圖形處理跨平台注意事項 2021-12-06 09:09 PM 0 999 .NET Core/.NET 6 號稱跨平台,但實際推進到 Linux,有些眉角遇上才會知道。 繼...
-
17
ASP.NET Core 部署 Linux 搭配 Nginx 注意事項一則-黑暗執行緒 幫忙看了一個茶包:建立 ASP.NET Core 6.0 專案部署到 CentOS 平台,搭配 Nginx Reverse Proxy 對外服務,卻怎麼...
-
8
閱讀筆記: 「升級 Kubernetes 1.22 的注意事項」 Posted on 2022-04-11 Views: 38 「升級 Kubernetes 1.22 的注意事項」 標題: 「升級 Kubernetes 1.22 的注意事項」類別: kubernetes
-
10
在 Go 語言中,如何高效的處理字串相加,由於字串 (string) 是不可變的,所以將很多字串拼接起來...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK