¿Por qué se necesita JsonRequestBehavior?


¿Por qué se necesita Json Request Behavior?

Si quiero restringir las solicitudes HttpGet a mi acción puedo decorar la acción con el atributo [HttpPost]

Ejemplo:

[HttpPost]
public JsonResult Foo()
{
    return Json("Secrets");
}

// Instead of:
public JsonResult Foo()
{
    return Json("Secrets", JsonRequestBehavior.AllowGet);
}

¿Por qué no es suficiente [HttpPost]?
Por qué el framework nos "bugs" con el JsonRequestBehavior.AllowGet para cada JsonResult que tenemos. Si quiero denegar las solicitudes get añadiré el atributo HttpPost.

Author: gdoron, 2011-12-11

5 answers

MVC por defecto es DenyGet para protegerlo contra un ataque muy específico que involucre solicitudes JSON para mejorar la probabilidad de que las implicaciones de permitir la exposición a HTTP GET se consideren antes de permitir que ocurran.

Esto se opone a después cuando podría ser demasiado tarde.

Nota: Si su método de acción no devuelve datos confidenciales, entonces debería ser seguro permitir el get.

Lectura adicional de my Wrox ASP.NET MVC3 book

Por por defecto, el ASP.NET MVC framework no le permite responder a una solicitud HTTP GET con una carga JSON. Si necesita enviar JSON respuesta a un GET, tendrá que permitir explícitamente el comportamiento por usando JsonRequestBehavior.AllowGet como segundo parámetro del Json método. Sin embargo, existe la posibilidad de que un usuario malicioso pueda obtener acceso a la carga JSON a través de un proceso conocido como secuestro JSON. No desea devolver información confidencial mediante JSON en una solicitud GET. Para más detalles, ver el post de Phil en http://haacked.com/archive/2009/06/24/json-hijacking.aspx / o esto ASÍ post.

Haack, Phil (2011). Cuadro orgánico ASP.NET MVC 3 (Programador de Wrox a Programador) (Ubicaciones Kindle 6014-6020). Wrox. Edición Kindle.

Pregunta relacionada sobre StackOverflow

Con la mayoría de los navegadores recientes (a partir de Firefox 21, Chrome 27, o IE 10), esto ya no es una vulnerabilidad.

 247
Author: danludwig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-01 20:37:32

Para hacerlo más fácil para usted también podría crear un actionfilterattribute

public class AllowJsonGetAttribute : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        var jsonResult = filterContext.Result as JsonResult;

        if (jsonResult == null)
            throw new ArgumentException("Action does not return a JsonResult, 
                                                   attribute AllowJsonGet is not allowed");

        jsonResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;            

        base.OnResultExecuting(filterContext);
    }
}

Y úsalo en tu acción

[AllowJsonGet]
public JsonResult MyAjaxAction()
{
    return Json("this is my test");
}
 51
Author: Arjen de Mooij,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-29 08:48:13

Por defecto Jsonresult "Deny get"

Supongamos que si tenemos método como el siguiente

  [HttpPost]
 public JsonResult amc(){}

Por defecto es "Deny Get".

En el siguiente método

public JsonResult amc(){}

Cuando necesita allowget o usar get ,tenemos que usar JsonRequestBehavior.AllowGet.

public JsonResult amc()
{
 return Json(new Modle.JsonResponseData { Status = flag, Message = msg, Html = html }, JsonRequestBehavior.AllowGet);
}
 6
Author: Deepakmahajan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-16 12:21:06

Mejorando un poco la respuesta de @Arjen de Mooij AllowJsonGetAttribute aplicable a los controladores mvc (no solo a los métodos de acción individuales):

using System.Web.Mvc;
public sealed class AllowJsonGetAttribute : ActionFilterAttribute, IActionFilter
{
    void IActionFilter.OnActionExecuted(ActionExecutedContext context)
    {
        var jsonResult = context.Result as JsonResult;
        if (jsonResult == null) return;

        jsonResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
    }

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        var jsonResult = filterContext.Result as JsonResult;
        if (jsonResult == null) return;

        jsonResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
        base.OnResultExecuting(filterContext);
    }
}
 4
Author: xDisruptor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-06 00:28:15

No lo necesitas.

Si su acción tiene el atributo HttpPost, entonces no necesita molestarse en configurar el JsonRequestBehavior y usar la sobrecarga sin él. Hay una sobrecarga para cada método sin la enumeración JsonRequestBehavior. Aquí están:

Sin JsonRequestBehavior

protected internal JsonResult Json(object data);
protected internal JsonResult Json(object data, string contentType);
protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding);

Con JsonRequestBehavior

protected internal JsonResult Json(object data, JsonRequestBehavior behavior);
protected internal JsonResult Json(object data, string contentType, 
                                   JsonRequestBehavior behavior);
protected internal virtual JsonResult Json(object data, string contentType, 
    Encoding contentEncoding, JsonRequestBehavior behavior);
 1
Author: CodingYoshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-10 22:54:41