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

上一篇: Why is JsonRequestBehavior needed?

下一篇: How to detect page zoom level in all modern browsers?