前言
在 ASP.NET MVC 的 Controller 之中如果是 return Json(viewModel); 的話,
Checkmarx 就會說它有 Reflected_XSS_All_Clients 的問題。
遇到 XSS 當然就是要 Encode 呀~
不過,物件那麼多的屬性,一個一個做嗎?
當然沒那麼笨呀!
網路上會改用 JsonNetResult 來取代原有的 JsonResult
解法
原本 HomeController 的程式如下,
1 | public class HomeController : Controller |
Checkmarx 掃出來的結果如下,
因為要改用 JsonNetResult ,所以就建立一個 JsonNetResult Class,並設定 StringEscapeHandling.EscapeHtml,
1 | public class JsonNetResult : JsonResult |
因為原本的 Controller 是直接 return Json ,如果要在不更改原有的程式碼,可以建立 BaseController (或是你們原本就有自已的 BaseController) ,覆寫 Json Method ,如下,
1 | public class BaseController : Controller |
然後原本的 Controller 將原本繼承的 Controller 改成 BaseController ,如下,
1 | public class HomeController : BaseController |
註: 目前筆者這版的 Checkmarx V9.2 無法正確知道有覆寫 JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior) Method ,所以必需要強迫覆蓋 base.Json Method 。如果未來 Checkmarx 修正好了後,就可以不需要去 強迫覆蓋 Json Method 了。
參考資料
ASP MVC 5 and Json.NET: action return type
Using JSON.NET to return ActionResult
Can you tell JSON.Net to serialize DateTime as Utc even if unspecified?