416 Stimmen

Warum wird JsonRequestBehavior benötigt?

Warum ist Json Request Behavior benötigt?

Wenn ich die HttpGet Anfragen an meine Aktion kann ich die Aktion mit dem [HttpPost] Attribut

Beispiel:

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

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

Warum ist nicht [HttpPost] ausreichend?
Warum uns der Rahmen mit dem "Fehler" der JsonRequestBehavior.AllowGet für jeden JsonResult die wir haben. Wenn ich Anfragen ablehnen möchte, füge ich die HttpPost Attribut.

293voto

danludwig Punkte 46148

MVC ist standardmäßig eingestellt auf DenyGet zum Schutz vor einem sehr spezifischen Angriff mit JSON-Anfragen, um die Wahrscheinlichkeit zu erhöhen, dass die Auswirkungen der Zulassung von HTTP GET Exposition berücksichtigt werden, bevor sie zugelassen werden.

Im Gegensatz zu später, wenn es vielleicht schon zu spät ist.

Hinweis: Wenn Ihre Aktionsmethode keine sensiblen Daten zurückgibt, sollte es sicher sein, das Get zuzulassen.

Weitere Informationen aus meinem Wrox ASP.NET MVC3-Buch

Standardmäßig erlaubt das ASP.NET MVC-Framework keine Antwort auf eine HTTP GET-Anforderung mit einer JSON-Nutzlast zu antworten. Wenn Sie JSON als Antwort auf eine Antwort auf einen GET senden müssen, müssen Sie das Verhalten explizit zulassen, indem Sie JsonRequestBehavior.AllowGet als zweiten Parameter für die Json Methode. Es besteht jedoch die Möglichkeit, dass ein böswilliger Benutzer Zugriff auf auf die JSON-Nutzdaten durch einen als JSON Hijacking bekannten Prozess. Sie wollen nicht Sie wollen keine sensiblen Informationen mit JSON in einer GET-Anforderung zurückgeben. Für weitere Einzelheiten finden Sie in Phils Beitrag unter http://haacked.com/archive/2009/06/24/json-hijacking.aspx/ o dieser SO-Posten.

Haack, Phil (2011). Professionelles ASP.NET MVC 3 (Wrox Programmer to Programmer) (Kindle Locations 6014-6020). Wrox. Kindle Edition.

Verwandte StackOverflow-Frage

Bei den meisten neueren Browsern (ab Firefox 21, Chrome 27 oder IE 10) ist dies keine Sicherheitslücke mehr.

64voto

Arjen de Mooij Punkte 620

Um es sich einfacher zu machen, könnten Sie auch ein actionfilter-Attribut erstellen

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

und verwenden Sie es für Ihre Aktion

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

9voto

Deepakmahajan Punkte 846

Standardmäßig Jsonresult "Deny get"

Angenommen, wir haben eine Methode wie die folgende

  [HttpPost]
 public JsonResult amc(){}

Standardmäßig heißt es "Get verweigern".

In der folgenden Methode

public JsonResult amc(){}

Wenn Sie get erlauben oder verwenden müssen, müssen wir JsonRequestBehavior.AllowGet verwenden.

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

6voto

XDS Punkte 3083

Ich verbessere die Antwort von @Arjen de Mooij ein wenig, indem ich die AllowJsonGetAttribute auf mvc-Controller anwendbar macht (nicht nur auf einzelne Action-Methoden):

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

3voto

CodingYoshi Punkte 23266

Sie brauchen es nicht.

Wenn Ihre Aktion die HttpPost Attribut, dann brauchen Sie sich nicht um das Setzen des JsonRequestBehavior und verwenden Sie die Überlast ohne sie. Für jede Methode gibt es eine Überladung ohne den JsonRequestBehavior enum. Hier sind sie:

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

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X