我是新來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傳遞的參數與通過非編碼傳遞的參數的方法。
就這樣,我明白了 - 不能(通過嘲弄一個請求將params包含爲字符串化的JSON)繞過HttpRequestValidation(惡意地)繞過MVC(3?)嗎?控制器行動會反映出這些參數,而不是更聰明? – 2011-05-16 15:17:27
請求驗證的部分原因是爲了防止危險字符(例如<和&)被反射回HTML或存儲在數據庫中。雖然請求驗證最多是最基本的(您仍然應該對來自外部源的輸出進行HTML編碼),但即使在使用JSON時,仍然值得實施。 – 2013-03-19 13:20:19