2016/10/25

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

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



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

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



/// 
/// 複寫原本的 Json Result
/// 
protected override JsonResult Json(object data, 
    string contentType, 
    System.Text.Encoding contentEncoding, 
    JsonRequestBehavior behavior)
{
    return new JsonNetResult()
    {
        Data = data,
        ContentType = contentType,
        ContentEncoding = contentEncoding
    };
}

/// 
/// Json.Net Result 
/// 
public class JsonNetResult : JsonResult
{
    public JsonSerializerSettings SerializerSettings { get; set; }
    public Formatting Formatting { get; set; }
    public JsonNetResult(){ }
    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null) throw new ArgumentNullException("context");
        HttpResponseBase response = context.HttpContext.Response;
        response.ContentType =
            !string.IsNullOrEmpty(ContentType) ? ContentType : "application/json";
        if (ContentEncoding != null)
            response.ContentEncoding = ContentEncoding;
        if (Data != null)
        {
            JsonTextWriter writer = new JsonTextWriter(response.Output)
            {
                Formatting = Formatting
            };
            JsonSerializer serializer = JsonSerializer.Create(SerializerSettings);
            serializer.Serialize(writer, Data); writer.Flush();
        }
    }
}


好問題來惹...

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

直接把 script 吐到 client 去 TAT




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

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

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

在 JsonNetRsult 的建構子中加入幾行

 
public JsonNetResult()
{    
    SerializerSettings = new JsonSerializerSettings()
    {
        StringEscapeHandling = StringEscapeHandling.EscapeHtml
    };
}

再重新跑一次剛剛的 Action



 html tag 成功被 encode 了!!

--

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



沒有留言:

張貼留言