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


почему 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 что у нас есть. Если я хочу отклонить запросы get, я добавлю .

5 336

5 ответов:

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

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

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

дальнейшее чтение из моего Wrox ASP.NET MVC3 книга

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

Haack, Phil (2011). Профессионал ASP.NET MVC 3 (Wrox Programmer to Программист) (Kindle Locations 6014-6020). Издательства wrox. Kindle Edition.

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

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

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

по умолчанию Jsonresult "Deny get"

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

  [HttpPost]
 public JsonResult amc(){}

по умолчанию это "запретить Get".

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

public JsonResult amc(){}

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

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

улучшение ответа @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);
    }
}

вам это не надо.

если ваше действие имеет 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);