JsonRequestBehavior가 필요한 이유는 무엇입니까?


384

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속성을 추가 합니다.


stackoverflow.com/questions/1625671/… 와 매우 유사합니다. (이 질문은 내 자신의 질문을 검색했지만 :)
Jedidja

POST는 그렇지 않지만 GET은 dem 등원이어야하기 때문입니다. GET-> POST를 작성하면 인터페이스의 의미가 변경됩니다.
rism

19
어디서나 crufty args를 추가하지 않아도 코드가 너무 깨끗해 보일 수 있습니다.
John Shedletsky 2016 년

답변:


276

MVC는 기본적으로 DenyGetJSON 요청과 관련된 매우 구체적인 공격으로부터 사용자를 보호하여 HTTP GET노출 허용의 의미 가 발생하기 전에 고려 되는 가능성을 개선합니다 .

나중에 너무 늦을 수 있습니다.

참고 : 조치 방법이 민감한 데이터를 리턴하지 않으면 가져 오기를 허용하는 것이 안전해야합니다.

Wrox ASP.NET MVC3 책에서 더 읽을 거리

기본적으로 ASP.NET MVC 프레임 워크에서는 JSON 페이로드로 HTTP GET 요청에 응답 할 수 없습니다. GET에 대한 응답으로 JSON을 보내야하는 경우 Json 메소드의 두 번째 매개 변수로 JsonRequestBehavior.AllowGet을 사용하여 동작을 명시 적으로 허용해야합니다. 그러나 악의적 인 사용자가 JSON 하이재킹이라는 프로세스를 통해 JSON 페이로드에 액세스 할 가능성이 있습니다. GET 요청에서 JSON을 사용하여 민감한 정보를 반환하지 않으려 고합니다. 자세한 내용은 Phil의 게시물 ( http://haacked.com/archive/2009/06/24/json-hijacking.aspx/) 또는 이 SO 게시물을 참조하십시오 .

Haack, Phil (2011). 전문가 용 ASP.NET MVC 3 (프로그래머 대 프로그래머) (Kindle Locations 6014-6020). 약 킨들 에디션.

관련 StackOverflow 질문

Firefox 21, Chrome 27 또는 IE 10부터 시작하는 최신 브라우저에서는 더 이상 취약점이 아닙니다.


20
그러나 [HttpPost]는 왜 충분하지 않은가?
gdoron은 Monica

4
충분하다고 생각합니다. HttpGet의 결과로 데이터가 전달되도록하려면 AllowGet 만 필요합니다. 매개 변수가 1 인 Json (data)을 호출하는 경우 DenyGet이 기본값입니다.
danludwig

11
이것은 나의 질문이다. JsonRequestBehavior.AllowGet내가 가진 모든 JsonResult에 대해 프레임 워크가 왜 우리를 "버그" 시키는가? 요청을 거부하려면 HttpPost속성을 추가 합니다.
gdoron은 Monica

35
많은 사람들이이 모호한 취약점을 알고 있지 않기 때문이라고 생각합니다. 요청을 거부하려면 [HttpPost]로 요청하십시오. 그러나 MVC 작성자는 이러한 종류의 공격에 대해 즉시 보호 계층을 제공합니다. 두 번째 인수를 추가하기 위해 노력해야하므로 노출하는 데이터와 그 민감도를 고려해야합니다.
danludwig

11
이제 우리는 API를 혼란스럽게 만들고 잠재적 인 CLIENT 기반 취약점을 극복하기 위해 "RESTful"인터페이스에 동사 혼동을 추가합니까? 이것은 끔찍한 것 같습니다 ...하지만 토론에 감사드립니다.
Norman H

59

더 쉽게 자신을 위해 액션 필터 속성을 만들 수도 있습니다

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

4
또한 RegisterGlobalFilters : filters.Add (new AllowJsonGetAttribute ())에서이 필터를 기본 필터로 설정할 수 있습니다. 그러나 모든 동작 방법에 필터가 적용되므로 예외를 제거해야합니다.
Vortex852456

8

기본적으로 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);
}

5

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

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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.