使用jQuery将数据模型发布到MVC4的安全性错误

时间:2013-05-03 07:39:29

标签: jquery asp.net ajax json asp.net-mvc-4

我有一个带有以下签名的MVC4控制器:

[HttpPost]
public JsonResult SubmitPage(PageSubmissionModel model)
{
   ...
   return Json(result);
}

其中返回模型是一个简单的模型:

public class Page 
{
    public Guid PageId { get; set; }
    public Guid SurveyId { get; set; }
    public int PageNo { get; set; }
    public string Title { get; set; }
    public string Introduction { get; set; }
}

或JSON编码的url字符串:

return Json(new {
        RedirectTo = Url.RouteUrl(route.RouteName, route.RouteValues)
});

使用以下jQuery方法从客户端调用此控制器:

ajaxPost: function (responseData, callback) {
    $.ajax({
        type: "POST",
        url: ""/Surveys/Ajax/SubmitPage",
        data: JSON.stringify(data),
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        cache: false,
        success: function (data) {
            if (typeof callback === 'function') {
                callback(data);
            }
        },
        error: function (xmlHttpRequest, errorMessage, exception) {
            var msg = "Problem calling " + url + "()\r\n" + errorMessage;
            alert(msg);
        }
    });
}

其中data参数是一个JavaScript对象,构造如下:

responseData = {
    SurveyResponseId: 23,
    SubscriberResponseId: 47,
    PageId: 1,
    Responses: [
        {id: 24, value: "Tom" },
        ....
    ]
  };

当我运行此代码时,我收到以下服务器错误:

此请求已被阻止,因为在GET请求中使用此信息时,可能会向第三方网站披露敏感信息

研究这个错误(http://haacked.com/archive/2009/06/25/json-hijacking.aspx)我很困惑,因为据我所知,并且由Fiddler出生,客户端正在发布JavaScript模型,所以我不明白为什么服务器会抛出GET请求错误。此外,Controller标有[HttpPost]属性。

如果有人能提供帮助,我们将不胜感激。

2 个答案:

答案 0 :(得分:1)

请尝试使用以下代码

[HttpPost]
public JsonResult SubmitPage(PageSubmissionModel model)
{
   ...
   return Json(result,JsonRequestBehavior.AllowGet);
}

答案 1 :(得分:0)

感谢Bardo先前的评论,我已经找到了这里发生的事情。

在某些情况下,客户端脚本构造的数据模型将错误的数据值分配给模型。这可能导致服务器上的未捕获异常,其错误消息(我认为)导致GET异常。

通过加强初始模型验证并在控制器中添加一些更强大的错误管理,我能够识别提交的模型中的错误,并因此将其追溯到其(JavaScript)构造函数。

最终,这个问题表明需要能够在开发中完全复制生产环境,在这种情况下我没有做到这一点。一旦我可以在调试器下复制问题,就很容易识别。