2011-01-06 11 views
51

Este error aparece aleatoriamente en nuestra aplicación MVC. A veces haciendo exactamente lo mismo no a veces, lo hará. ¿Alguien sabe si esto tiene que ver con algo que podría ser una solución simple, o si esto es algo común que muchos de ustedes han visto?Error de permiso de Json

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) 

Respuesta

118

Respondió que su pregunta estaba en el rastro de la pila. "JsonRequestBehavior a AllowGet"

a fin de utilizarlo en su controlador como:

return Json(data, JsonRequestBehavior.AllowGet) 
+27

yo creo que puede ser un error para dar la vuelta y ciegamente decirle la gente ignora las razones de seguridad por las cuales AllowGet está deshabilitado. - No es tan difícil hacer un $ .post en su lugar para obtener los datos y evitar todo el problema juntos. – Yablargo

+11

Buen punto. Para los interesados, Haack tiene un excelente artículo que trata sobre esto: http://haacked.com/archive/2009/06/25/json-hijacking.aspx –

+2

El artículo de Haack está ahora en: http://haacked.com/archive/ 2009/06/24/json-hijacking.aspx/ –

4

Parece que en algún momento se llama a la acción del controlador por HTTP GET. Para poder volver JSON resulta que debe usar un código como

return Json(data, JsonRequestBehavior.AllowGet); 
22

Debe leer http://haacked.com/archive/2009/06/24/json-hijacking.aspx/ antes de pasar por estos controles de seguridad.

Si solo expone sus datos JSON en respuesta a un POST Http, entonces no es vulnerable a este ataque.

Simplemente puede anotar su acción JSON con [HttpPost] y en el cliente de hacer algo como

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

}); 
+3

Es completamente razonable aceptar una solicitud GET cuando intenta recibir datos JSON. Los POST deben ser para crear un nuevo registro, o al menos cambiar el estado. Las solicitudes GET deben ser para recuperar datos que no afectan el estado. – ashurexm

+1

El motivo por el que existe la solución JsonRequestBehavior.AllowGet anterior es garantizar que el desarrollador eluda por completo esta protección. La sugerencia de utilizar una publicación es evitar un error en el diseño/implementación que permita que estos datos estén expuestos a terceros. Esto incluso se muestra en la primera línea del seguimiento de la pila: System.InvalidOperationException: esta solicitud ** se ha bloqueado porque la información sensible podría divulgarse a sitios web de terceros cuando se utiliza en una solicitud GET **. Para permitir solicitudes GET, establezca JsonRequestBehavior en AllowGet – Yablargo

-1

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

Cuestiones relacionadas