我是新来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