wake-up-neo.com

Warum wird JsonRequestBehavior benötigt?

Warum ist Json Request Behavior erforderlich?

Wenn ich die HttpGet Anfragen auf meine Aktion beschränken möchte, 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 "nervt" uns das Framework mit dem JsonRequestBehavior.AllowGet für jedes JsonResult, das wir haben. Wenn ich Anfragen ablehnen möchte, füge ich das HttpPost Attribut hinzu.

360
gdoron

MVC verwendet standardmäßig DenyGet, um Sie vor einem sehr spezifischen Angriff zu schützen, der JSON-Anforderungen umfasst, um die Wahrscheinlichkeit zu verbessern, dass die Auswirkungen des Zulassens von HTTP GET Die Exposition wird berücksichtigt, bevor sie eintreten kann.

Dies ist im Gegensatz zu später, wenn es zu spät sein könnte.

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

Weitere Lektüre aus meinem Wrox ASP.NET MVC3-Buch

Das ASP.NET MVC-Framework ermöglicht es Ihnen standardmäßig nicht, auf eine HTTP-GET-Anforderung mit einer JSON-Nutzlast zu antworten. Wenn Sie JSON als Antwort auf ein GET senden müssen, müssen Sie das Verhalten explizit zulassen, indem Sie JsonRequestBehavior.AllowGet als zweiten Parameter für die Json-Methode verwenden. Es besteht jedoch die Möglichkeit, dass ein böswilliger Benutzer über einen als JSON-Hijacking bezeichneten Prozess Zugriff auf die JSON-Nutzdaten erhält. Sie möchten keine vertraulichen Informationen mithilfe von JSON in einer GET-Anforderung zurückgeben. Weitere Informationen finden Sie in Phils Beitrag unter http://haacked.com/archive/2009/06/24/json-hijacking.aspx/ oder this SO Post.

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 (beginnend mit Firefox 21, Chrome 27 oder IE 10)) ist dies keine Sicherheitsanfälligkeit mehr.

267
danludwig

Um es Ihnen einfacher zu machen, können Sie auch ein Aktionsfilterattribut 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");
}
54
Arjen de Mooij

Standardmäßig Jsonresult "Deny get"

Angenommen, wir haben eine Methode wie die folgende

  [HttpPost]
 public JsonResult amc(){}

Standardmäßig ist es "Deny Get".

In der folgenden Methode

public JsonResult amc(){}

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

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

Verbessern Sie die Antwort von @Arjen de Mooij ein wenig, indem Sie das AllowJsonGetAttribute auf MVC-Controller anwenden (nicht nur auf einzelne Aktionsmethoden):

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

Du brauchst es nicht.

Wenn Ihre Aktion das Attribut HttpPost hat, müssen Sie sich nicht mit dem Festlegen von JsonRequestBehavior befassen und die Überladung ohne dieses Attribut verwenden. Es gibt eine Überladung für jede Methode ohne das 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);
2
CodingYoshi