为什么需要JsonRequestBehavior?

时间:2011-12-11 14:26:05

标签: c# .net asp.net-mvc asp.net-mvc-3 security

为什么需要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的{​​{1}}“提出错误”。如果我想拒绝获取请求,我会添加JsonResult属性。

5 个答案:

答案 0 :(得分:262)

MVC默认为DenyGet,以保护您免受涉及JSON请求的特定攻击,以提高允许HTTP GET曝光的影响在允许它们发生之前的可能性。

这可能为时已晚,这与之后相反。

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

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

  

默认情况下,ASP.NET MVC框架不允许您响应   带有JSON有效负载的HTTP GET请求。如果你需要发送JSON   响应GET,您需要明确允许行为   使用JsonRequestBehavior.AllowGet作为Json的第二个参数   方法。但是,恶意用户有可能获得访问权限   JSON有效负载通过称为JSON Hijacking的进程。你不   想要在GET请求中使用JSON返回敏感信息。对于   更多细节,请参阅菲尔的帖子   http://haacked.com/archive/2009/06/24/json-hijacking.aspx/this SO post.

     

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

相关的StackOverflow问题

With most recents browsers (starting with Firefox 21, Chrome 27, or IE 10), this is no more a vulnerability.

答案 1 :(得分:52)

为了让自己更容易,您还可以创建一个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");
}

答案 2 :(得分:7)

默认Jsonresult“拒绝获取”

假设我们有以下方法

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

答案 3 :(得分:5)

通过制作@Arjen de Mooij的答案来改进 AllowJsonGetAttribute适用于mvc-controllers(不仅仅是单独的action-methods):

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

答案 4 :(得分:2)

你不需要它。

如果您的操作具有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);