Зачем нужен 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 ответов


MVC по умолчанию DenyGet чтобы защитить вас от очень конкретной атаки с участием JSON-запросов для улучшения сходства, что последствия разрешения 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 для Программист) (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.AllowGet.

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