为什么需要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返回敏感信息。 有关更多详细信息,请参阅Phil的帖子http://haacked.com/archive/2009/06/24/json-hijacking.aspx/或此SO帖子。
哈克,菲尔(2011)。 专业的ASP.NET MVC 3(Wrox程序员到程序员)(Kindle Locations 6014-6020)。 Wrox的。 Kindle版。
相关的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(){}
默认情况下它是“拒绝获取”。
在下面的方法
public JsonResult amc(){}
当你需要允许或使用get时,我们必须使用JsonRequestBehavior.AllowGet。
public JsonResult amc()
{
return Json(new Modle.JsonResponseData { Status = flag, Message = msg, Html = html }, JsonRequestBehavior.AllowGet);
}
链接地址: http://www.djcxy.com/p/47769.html