2011-05-16 48 views
1

我是新來MVC3框架(.NET和整體; Java的老手),所以忍耐一下,但這裏有雲:提交到一個控制器.NET MVC3 HttpRequestValidation和JSON

輸入爲JSON似乎並不受制於HttpRequestValidation - 這聽起來是對的嗎?
我意識到如果您通過JSON接收數據輸入,您可能已經做了更多的工作,但Controller Action似乎並不一定知道它是否具有JSON數據;輸入值映射到參數,就像它們是標準POST參數一樣。
例子 - 我異步提交JSON數據到我的控制器類似如下:

var data = { "title": $titleField.val(), "content": $textArea.val(), 
     "location": $location.val() 
    }; 

    $.ajax(submitUrl, 
     { 
      type: "POST", 
      contentType: "application/json; charset=utf-8", 
      complete: function (data) { 
       //blah blah 
      }, 
      dataType: 'json', 
      data: JSON.stringify(data) 
     }); 
    } 

我再接收輸入我的行動:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult New(string title = "", string content = "", string location = "") 
    { 
    //yada yada 
    } 

這樣做,則params映射和用戶可以很容易地發送標籤等。我沒有關閉ValidateInput,如果我使用標準POST提交併刪除了Stringify,它會按預期引發錯誤。爲什麼JSON化數據會跳過驗證的任何充分理由?

編輯 - 更具體的問題:如果JSONified數據將通過HttpRequestValidation,我們如何防止事件,其中有人會故意嘲笑發送JSON數據,而不是post數據的請求?我還沒有找到強制Action方法來區分作爲JSON傳遞的參數與通過非編碼傳遞的參數的方法。

回答

0

爲什麼JSON化數據會跳過驗證的很好的理由?

JSON編碼=>所以它確保通過線路傳輸的是安全。當你使用JSON.stringify所有危險字符都被編碼。

+0

就這樣,我明白了 - 不能(通過嘲弄一個請求將params包含爲字符串化的JSON)繞過HttpRequestValidation(惡意地)繞過MVC(3?)嗎?控制器行動會反映出這些參數,而不是更聰明? – 2011-05-16 15:17:27

+0

請求驗證的部分原因是爲了防止危險字符(例如<和&)被反射回HTML或存儲在數據庫中。雖然請求驗證最多是最基本的(您仍然應該對來自外部源的輸出進行HTML編碼),但即使在使用JSON時,仍然值得實施。 – 2013-03-19 13:20:19

1

asp.net得到了我的問題的答案 - 請參閱第二個答覆。

解決方案涉及替換默認的ModelBinder。