2011-05-16 49 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。