为什么需要JsonRequestBehavior?

问题描述 投票:0回答:5

为什么需要

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
来“打扰”我们每一个
JsonResult
。如果我想拒绝获取请求,我将添加
HttpPost
属性。

c# .net asp.net-mvc asp.net-mvc-3 security
5个回答
296
投票

MVC 默认为

DenyGet
来保护您免受涉及 JSON 请求的非常具体的攻击,以提高在允许
HTTP GET
暴露的影响发生之前就考虑到它们的可能性。

这与事后可能为时已晚的情况相反。

注意:如果您的操作方法不返回敏感数据,那么允许 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 位置 6014-6020)。沃克斯。点燃版。

相关 StackOverflow 问题

对于大多数最新的浏览器(从 Firefox 21、Chrome 27 或 IE 10 开始),这不再是一个漏洞。


64
投票

为了让自己更轻松,您还可以创建一个 actionfilter 属性

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

10
投票

默认 Jsonresult“拒绝获取”

假设我们有如下方法

  [HttpPost]
 public JsonResult amc(){}

默认为“拒绝获取”。

在下面的方法中

public JsonResult amc(){}

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

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

6
投票

通过制作以下内容,对@Arjen de Mooij 的答案进行了一些改进 AllowJsonGetAttribute 适用于 mvc 控制器(不仅仅是单个操作方法):

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

3
投票

你不需要它。

如果您的操作具有

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);
© www.soinside.com 2019 - 2024. All rights reserved.