【问题标题】:Json allowget errorJson允许获取错误
【发布时间】:2011-06-04 17:21:39
【问题描述】:

这个错误随机出现在我们的 MVC 应用程序中。有时做同样的事情,有时它不会,它会。有谁知道这是否与任何可以简单修复的事情有关,或者这是否是你们很多人都见过的常见问题?

System.InvalidOperationException: This request has been blocked because sensitive information could be disclosed to third party web sites when this is used in a GET request. To allow GET requests, set JsonRequestBehavior to AllowGet.
   at System.Web.Mvc.JsonResult.ExecuteResult(ControllerContext context)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass14.b__11()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass14.<>c__DisplayClass16.b__13()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass14.<>c__DisplayClass16.b__13()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass14.<>c__DisplayClass16.b__13()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult)
   at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)
   at System.Web.Mvc.Controller.ExecuteCore()
   at System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext)
   at System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext)
   at System.Web.Mvc.MvcHandler.<>c__DisplayClass8.b__4()
   at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.b__0()
   at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.b__7(IAsyncResult _)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
   at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)
   at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

【问题讨论】:

    标签: jquery asp.net-mvc json


    【解决方案1】:

    您的问题的答案在堆栈跟踪中。 "JsonRequestBehavior 到 AllowGet"

    所以在你的控制器中使用它:

    return Json(data, JsonRequestBehavior.AllowGet)
    

    【讨论】:

    【解决方案2】:

    在绕过这些安全控制之前,您应该阅读http://haacked.com/archive/2009/06/24/json-hijacking.aspx/

    如果您只公开您的 JSON 数据以响应 Http POST,那么您就不容易受到这种攻击。

    您可以简单地使用 [HttpPost] 注释您的 JSON 操作,然后在客户端执行类似的操作

    $.post('/blag/JSON', function (data) {
           //do something with my json data object here
    
    });
    

    【讨论】:

    • 在尝试接收 JSON 数据时接受 GET 请求是完全合理的。 POST 应该用于创建新记录,或者至少用于更改状态。 GET 请求应该用于检索不影响状态的数据。
    • 上述 JsonRequestBehavior.AllowGet 解决方案之所以存在,是为了确保开发者故意绕过这个保护。使用帖子的建议是为了避免设计/实现中的缺陷,从而使这些数据暴露给第三方。这甚至显示在堆栈跟踪的第一行中:System.InvalidOperationException: 此请求已被阻止,因为在 GET 请求中使用敏感信息可能会泄露给第三方网站。要允许 GET 请求,请将 JsonRequestBehavior 设置为 AllowGet
    【解决方案3】:

    您似乎有时会根据 HTTP GET 调用控制器操作。为了能够返回 JSON 结果,您应该使用类似

    的代码
    return Json(data, JsonRequestBehavior.AllowGet);
    

    【讨论】:

      【解决方案4】:

      return Json(PartialView("index").ToJsonObject(this), JsonRequestBehavior.AllowGet);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-17
        • 1970-01-01
        • 1970-01-01
        • 2020-09-25
        • 2017-04-10
        • 2016-10-25
        • 2015-09-26
        • 2017-01-10
        相关资源
        最近更新 更多