Pourquoi est-ce que JsonRequestBehavior est 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] 151990920"

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, j'ajouterai l'attribut HttpPost .

336
demandé sur gdoron 2011-12-11 18:26:05

5 réponses

MVC par défaut à DenyGet pour vous protéger contre une attaque très spécifique impliquant des requêtes JSON pour améliorer la probabilité que les implications d'autoriser HTTP GET exposition sont considérées à l'avance de Les permettre de se produire.

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

Note: Si votre méthode d'action ne renvoie pas de données sensibles, alors il devrait être sûr d'autoriser l'get.

D'autres lectures de mon Wrox ASP.NET MVC3 book

par défaut, le ASP.NET MVC framework ne vous permet pas de répondre à une requête HTTP GET avec une charge JSON. Si vous avez besoin d'envoyer JSON réponse à OBTENIR un, vous devez autoriser explicitement le comportement par utiliser JsonRequestBehavior.AllowGet comme second paramètre du Json méthode. Cependant, il ya une chance qu'un utilisateur malveillant peut accéder à la charge utile JSON par un processus connu sous le nom de détournement JSON. Vous n'avez pas vous voulez retourner des informations sensibles en utilisant JSON dans une requête GET. Pour plus de détails, voir le post de Phil à http://haacked.com/archive/2009/06/24/json-hijacking.aspx/ ou ce tant de poster.

Haack, Phil (2011). Professionnel ASP.NET MVC 3 (programmeur Wrox à Programmeur) (Kindle Localisations 6014-6020). Wrox. L'Édition Kindle.

question connexe sur L'écoulement des piles

avec la plupart des navigateurs récents (en commençant par Firefox 21, Chrome 27, ou IE 10), ce n'est plus une vulnérabilité.

247
répondu danludwig 2017-09-01 20:37:32

pour vous faciliter la tâche, vous pouvez aussi créer un attribut actionfilter

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 l'utiliser sur votre action

[AllowJsonGet]
public JsonResult MyAjaxAction()
{
    return Json("this is my test");
}
51
répondu Arjen de Mooij 2017-08-29 08:48:13

Par défaut Jsonresult "Refuser l'obtenir"

supposons que nous ayons une méthode comme ci-dessous

  [HttpPost]
 public JsonResult amc(){}

par défaut"Deny Get".

dans la méthode ci-dessous

public JsonResult amc(){}

quand vous avez besoin d'autoriser ou d'utiliser get ,nous devons utiliser JsonRequestBehavior.AllowGet.

public JsonResult amc()
{
 return Json(new Modle.JsonResponseData { Status = flag, Message = msg, Html = html }, JsonRequestBehavior.AllowGet);
}
6
répondu Deepakmahajan 2012-08-16 12:21:06

améliorer un peu la réponse de @Arjen De Mooij en faisant AllowJsonGetAttribute applicable aux contrôleurs mvc (pas seulement les 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);
    }
}
4
répondu xDisruptor 2017-09-06 00:28:15

Vous n'en avez pas besoin.

si votre action a l'attribut HttpPost , alors vous n'avez pas besoin de prendre la peine de régler le JsonRequestBehavior et d'utiliser la surcharge sans elle. Il y a une surcharge pour chaque méthode sans l'enum JsonRequestBehavior . 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);
1
répondu CodingYoshi 2017-12-10 22:54:41