2016/10/25

[筆記] ASP.NET MVC 改用 Json.Net 回應 JSON 時處理 XSS 問題

其實 ASP.NET MVC 內建的 JavaScriptSerializer 就有做到將 html 給 encode 來預防 xss 了



但為了效能ISO 8601 日期格式考量

在我們開發的系統中就把 JavaScriptSerializer 給換成 Json.Net 了 (如下 & 作法的參考網址)


  1. ///
  2. /// 複寫原本的 Json Result
  3. ///
  4. protected override JsonResult Json(object data,
  5. string contentType,
  6. System.Text.Encoding contentEncoding,
  7. JsonRequestBehavior behavior)
  8. {
  9. return new JsonNetResult()
  10. {
  11. Data = data,
  12. ContentType = contentType,
  13. ContentEncoding = contentEncoding
  14. };
  15. }
  16. ///
  17. /// Json.Net Result
  18. ///
  19. public class JsonNetResult : JsonResult
  20. {
  21. public JsonSerializerSettings SerializerSettings { get; set; }
  22. public Formatting Formatting { get; set; }
  23. public JsonNetResult(){ }
  24. public override void ExecuteResult(ControllerContext context)
  25. {
  26. if (context == null) throw new ArgumentNullException("context");
  27. HttpResponseBase response = context.HttpContext.Response;
  28. response.ContentType =
  29. !string.IsNullOrEmpty(ContentType) ? ContentType : "application/json";
  30. if (ContentEncoding != null)
  31. response.ContentEncoding = ContentEncoding;
  32. if (Data != null)
  33. {
  34. JsonTextWriter writer = new JsonTextWriter(response.Output)
  35. {
  36. Formatting = Formatting
  37. };
  38. JsonSerializer serializer = JsonSerializer.Create(SerializerSettings);
  39. serializer.Serialize(writer, Data); writer.Flush();
  40. }
  41. }
  42. }


好問題來惹...

改完之後發現原本上面那段回應 Javascript 的 Json Result 不 encode 了

直接把 script 吐到 client 去 TAT




如果要一個一個 property 都給他 htmlEncode 過才丟給 JsonNetResult 來處理那未免也太蠢

稍微檢視一下參考(?)來的程式,發現 JsonSerializerSettings 可能會是一個切入點

查了一下 newtonsoft 的說明發現裡面有個 StringEscapeHandling 可以指定!!

在 JsonNetRsult 的建構子中加入幾行

  1. public JsonNetResult()
  2. {
  3. SerializerSettings = new JsonSerializerSettings()
  4. {
  5. StringEscapeHandling = StringEscapeHandling.EscapeHtml
  6. };
  7. }

再重新跑一次剛剛的 Action



 html tag 成功被 encode 了!!

--

是說在考量效能時有考慮使用 Jil 但卡在 EscapeHtml 這個問題上,就沒有轉換成這個



沒有留言:

張貼留言