Зачем нужен 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);