Зачем нужен JsonRequestBehavior? - PullRequest
       2

Зачем нужен JsonRequestBehavior?

356 голосов
/ 11 декабря 2011

Зачем Json Request Behavior нужно?

Если я хочу ограничить запросы HttpGet для своего действия, я могу украсить действие атрибутом [HttpPost]

Пример:

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

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

Почему [HttpPost] недостаточно?
Почему фреймворк «наседает» на нас JsonRequestBehavior.AllowGet за каждый JsonResult, который у нас есть. Если я хочу отказать в получении запросов, я добавлю атрибут HttpPost.

Ответы [ 5 ]

263 голосов
/ 11 декабря 2011

MVC по умолчанию равен DenyGet, чтобы защитить вас от очень специфической атаки, включающей запросы JSON, чтобы повысить вероятность того, что последствия разрешения HTTP GET воздействия будут рассмотрены заранее, чтобы позволить им произойти.

Это противоположно тому, когда может быть слишком поздно.

Примечание. Если ваш метод действия не возвращает конфиденциальные данные, тогда можно безопасно разрешить получение.

Дополнительная информация из моей книги по Wrox ASP.NET MVC3

По умолчанию платформа ASP.NET MVC не позволяет вам отвечать на HTTP-запрос GET с полезной нагрузкой JSON. Если вам нужно отправить JSON в ответ на GET, вам нужно явно разрешить поведение используя JsonRequestBehavior.AllowGet в качестве второго параметра Json метод. Однако существует вероятность, что злоумышленник может получить доступ к полезная нагрузка JSON через процесс, известный как JSON Hijacking. Вы не хотите вернуть конфиденциальную информацию, используя JSON в запросе GET. За более подробную информацию смотрите в посте Фила на http://haacked.com/archive/2009/06/24/json-hijacking.aspx/ или этот пост.

Haack, Phil (2011). Профессиональный ASP.NET MVC 3 (программист Wrox для Программист) (Kindle Locations 6014-6020). Wrox. Kindle Edition.

Связанный вопрос StackOverflow

В большинстве новых браузеров (начиная с Firefox 21, Chrome 27 или IE 10) эта уязвимость больше не существует.

53 голосов
/ 25 февраля 2015

Чтобы вам было проще, вы также можете создать 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);
    }
}

и используйте его в своем действии

[AllowJsonGet]
public JsonResult MyAjaxAction()
{
    return Json("this is my test");
}
7 голосов
/ 14 февраля 2012

По умолчанию Jsonresult "Запретить получение"

Предположим, если у нас есть метод, как показано ниже

  [HttpPost]
 public JsonResult amc(){}

По умолчанию это «Запретить получение».

В приведенном ниже методе

public JsonResult amc(){}

Когда вам нужно разрешить или использовать get, мы должны использовать JsonRequestBehavior.AllowGet.

public JsonResult amc()
{
 return Json(new Modle.JsonResponseData { Status = flag, Message = msg, Html = html }, JsonRequestBehavior.AllowGet);
}
5 голосов
/ 07 декабря 2016

Улучшение ответа @Arjen de Mooij, сделав AllowJsonGetAttribute применим к mvc-контроллерам (а не только к отдельным методам действий):

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);
    }
}
2 голосов
/ 11 декабря 2017

Тебе это не нужно.

Если ваше действие имеет атрибут HttpPost, вам не нужно беспокоиться об установке JsonRequestBehavior и использовать перегрузку без него. Существует перегрузка для каждого метода без перечисления JsonRequestBehavior. Вот они:

Без 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);

С 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...