为什么需要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); } }