为什么需要JsonRequestBehavior?

为什么需要Json Request Behavior

如果我想限制HttpGet请求到我的行动,我可以用[HttpPost]属性装饰行动

例:

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

为什么不是[HttpPost]足够?
为什么框架为我们所拥有的每个JsonResult提供了JsonRequestBehavior.AllowGet 。 如果我想拒绝请求,我将添加HttpPost属性。

MVC默认使用DenyGet来保护您免受涉及JSON请求的非常特殊的攻击,从而提高允许HTTP GET暴露的影响的可能性。

这是事后反对的时候,可能为时已晚。

注意:如果您的操作方法没有返回敏感数据,那么允许获取应该是安全的。

从我的Wrox ASP.NET MVC3书进一步阅读

默认情况下,ASP.NET MVC框架不允许您使用JSON负载来响应HTTP GET请求。 如果您需要发送JSON以响应GET,则需要使用JsonRequestBehavior.AllowGet作为Json方法的第二个参数来显式允许该行为。 但是,恶意用户有机会通过称为JSON劫持的过程访问JSON有效负载。 您不希望在GET请求中使用JSON返回敏感信息。 欲了解更多详情,请参阅菲尔的posthttp://haacked.com/archive/2009/06/24/json-hijacking.aspx/或这个SOpost。

哈克,菲尔(2011)。 专业ASP.NET MVC 3(Wrox程序员程序员)(Kindle地址6014-6020)。 Wrox的。 Kindle版。

相关的StackOverflow问题

随着最新的浏览器(从Firefox 21,Chrome 27或IE 10开始),这不再是一个漏洞。

为了使自己更容易,你也可以创build一个actionfilterttribute

 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(){} 

默认情况下它是“拒绝获取”。

在下面的方法

 public JsonResult amc(){} 

当你需要允许或者使用get时,我们必须使用JsonRequestBehavior.AllowGet。

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

通过使AllowJsonGetAttribute适用于mvc-控制器(而不仅仅是单独的操作方法)来改进@Arjen de Mooij的答案:

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