web-dev-qa-db-fra.com

Pourquoi JsonRequestBehavior est-il nécessaire?

Pourquoi Json Request Behavior est-il nécessaire?

Si je veux restreindre les requêtes HttpGet à mon action, je peux décorer l'action avec l'attribut [HttpPost].

Exemple:

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

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

Pourquoi [HttpPost] n'est-il pas suffisant?
Pourquoi le cadre nous "bogue" avec le JsonRequestBehavior.AllowGet pour chaque JsonResult que nous avons. Si je veux refuser les requêtes get, je vais ajouter l'attribut HttpPost.

360
gdoron

MVC utilise par défaut DenyGet pour vous protéger contre une attaque très spécifique impliquant des requêtes JSON, afin d'améliorer la probabilité que les implications de l'autorisation de HTTP GET soient examinées avant de les autoriser.

Ceci est opposé à après quand il pourrait être trop tard.

Remarque: Si votre méthode d'action ne renvoie pas de données sensibles, vous devez autoriser le get.

Autres lectures de mon livre Wrox ASP.NET MVC3

Par défaut, l'infrastructure ASP.NET MVC ne vous permet pas de répondre à une demande HTTP GET avec une charge JSON. Si vous devez envoyer du JSON en réponse à un GET, vous devez explicitement autoriser ce comportement en utilisant JsonRequestBehavior.AllowGet en tant que deuxième paramètre de la méthode Json. Cependant, il est possible qu'un utilisateur malveillant puisse accéder à la charge utile JSON via un processus appelé détournement JSON. Vous ne souhaitez pas renvoyer d'informations sensibles à l'aide de JSON dans une requête GET. Pour plus de détails, voir le message de Phil sur http://haacked.com/archive/2009/06/24/json-hijacking.aspx/ ou this SO post.

Haack, Phil (2011). ASP.NET MVC 3 professionnel (programmeur à programmeur Wrox) (emplacements Kindle 6014 à 6020). Wrox. Édition Kindle.

Question relative à StackOverflow

Avec la plupart des navigateurs récents (à partir de Firefox 21, Chrome 27 ou IE 10), il ne s'agit plus d'une vulnérabilité.

267
danludwig

Pour vous faciliter la tâche, vous pouvez également créer un filtre d'action

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);
    }
}

et utilisez-le sur votre action

[AllowJsonGet]
public JsonResult MyAjaxAction()
{
    return Json("this is my test");
}
54
Arjen de Mooij

Par défaut, Jsonresult "Deny get"

Supposons si nous avons une méthode comme ci-dessous

  [HttpPost]
 public JsonResult amc(){}

Par défaut, il "Deny Get".

Dans la méthode ci-dessous

public JsonResult amc(){}

Lorsque vous devez permettregetget ou utiliser get, vous devez utiliser JsonRequestBehavior.AllowGet.

public JsonResult amc()
{
 return Json(new Modle.JsonResponseData { Status = flag, Message = msg, Html = html }, JsonRequestBehavior.AllowGet);
}
8
Deepakmahajan

Améliorant un peu la réponse de @Arjen de Mooij en rendant le AllowJsonGetAttribute applicable aux mvc-controllers (pas simplement aux méthodes d'action individuelles):

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);
    }
}
5
XDS

Tu n'en a pas besoin.

Si votre action a l'attribut HttpPost, vous n'avez pas besoin de vous préoccuper de la définition de JsonRequestBehavior et d'utiliser la surcharge sans cela. Il y a une surcharge pour chaque méthode sans le JsonRequestBehavior enum. Les voici:

sans 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);

avec 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);
2
CodingYoshi