JsonRequestBehavior를 AllowGet으로 설정할 때 어떤 '민감한 정보'가 공개 될 수 있습니까?


112

나는 (내장을 사용하여) URL브라우저의 주소 표시 줄에서 새 항목 을 테스트 할 때마다 동일한 이전 오류가 발생 returning Json했습니다 MVC JsonResult helper.

.NET Framework에서 사용되는 경우 민감한 정보가 타사 웹 사이트에 공개 될 수 있기 때문에이 요청이 차단되었습니다 GET request. 허용하려면 GET requests로 설정 JsonRequestBehavior하십시오 AllowGet.

이번에는 GET요청 을 통해 요청이 드러내지 않는 것이 정확히 무엇인지 궁금합니다 POST.

답변:


82

웹 사이트에 GetUser웹 방식 이 있다고 가정 해 보겠습니다 .

http://www.example.com/User/GetUser/32

JSON 응답을 반환합니다.

{ "Name": "John Doe" }

이 메소드가 POST 요청 만 허용 http://www.example.com/User/GetUser/32하는 경우 POST 메소드 를 사용하여 AJAX 요청이 작성되는 경우에만 컨텐츠가 브라우저로 리턴됩니다 . CORS를 구현하지 않은 경우 브라우저는이 요청을 수행하는 다른 도메인의 데이터를 보호합니다.

그러나 GET 요청을 허용하고 POST 대신 GET을 사용하여 위와 유사한 AJAX 요청을 수행하면 악의적 인 사용자가 scriptHTML 의 태그를 사용하여 자신의 사이트 컨텍스트에 JSON을 포함시킬 수 있습니다 . 예 www.evil.com:

<script src="http://www.example.com/User/GetUser/32"></script>

이 JavaScript는 www.evil.com웹 메서드에서 반환 된 개체를 읽을 방법이 없어야 하기 때문에 쓸모 가 없어야합니다. 그러나 이전 버전의 브라우저 (예 : Firefox 3)의 버그로 인해 JavaScript 프로토 타입 객체를 재정의하고 www.evil.com메소드에서 반환 한 데이터를 읽을 수 있습니다. 이를 JSON 하이재킹이라고합니다.

이를 방지하는 몇 가지 방법은 이 게시물 을 참조하십시오 . 그러나 최신 버전의 최신 브라우저 (Firefox, Chrome, IE)에서는 알려진 문제가 아닙니다.


25
좋은 게시물이지만 컨트롤러에 [Authorize] 태그를 포함하면 보안에 대해 걱정할 필요가 없습니다. 이 코드 의지 도움말 사람을 희망, JSON (returnMsg, JsonRequestBehavior.AllowGet)
Dhanuka777

17
@ Dhanuka777 : 불행히도 사실이 아닙니다. 방법에 부작용 (예 :) 이있는 경우 CSRF 공격이 가능할 수 있습니다 www.example.com/User/DeleteUser/32. 요청에는 피해자의 컴퓨터에서 오는 인증에 필요한 쿠키가 포함되기 때문입니다. [Authorize]하지 않습니다 당신 저장 중 아주 오래된 브라우저의 경우 여기에 설명 된 공격에서 - 그것은 자신이 방문하는 사용자입니다 www.evil.com요청 있도록 www.evil.com할 수 있습니다 www.example.com인증 쿠키를 포함합니다은.
SilverlightFox

1
작업에 부작용이있는 경우 GET 메서드를 사용하여 호출해서는 안됩니다. 규칙은 데이터를 읽기 위해 GET을 사용하는 것이며 모든 부작용 작업은 POST, PUT, DELETE 등을 사용해야합니다. 즉, I 이 '민감한 정보'오류 메시지가 오해의 소지가 있다고 생각하면됩니다. 개발자가 GET 메서드를 사용해야하는 방식으로 사용하면 모든 것이 정상입니다! :)
ps_ttf

1
나는 그것이 여전히 어떤 차이를 만드는지 잘 모르겠습니다. 게시물과 같지 않은 것은 얻는 것보다 더 보호되거나 암호화됩니다. 여전히 일반 텍스트입니다. 모든 도구를 통해 게시하는 것처럼 쉽게 요청을 보낼 수 있으며 여전히 동일한 일반 텍스트 정보를 다시 얻을 수 있습니다. 악의적 인 사용자는 자신의 사이트에 서버 측 코드를 쉽게 작성하여 게시물을 작성할 수도 있습니다.
computrius

1
@Castrohenge : 아니요, 스크립트 src에 대한 GET 요청과 함께 전송되지 않는 헤더를 설정해야하기 때문입니다.
SilverlightFox

111

반환시 다음을 사용하십시오.

return this.Json("you result", JsonRequestBehavior.AllowGet);

7
이것이 실제로 OP의 질문에 어떻게 대답합니까? 이 모든 대답은 예외를
피하는

2
네, 사용하세요. 빈 캐치로 캐치를 시도하는 것과 같습니다. 이 녀석을 사용하지 마십시오 (위험을 이해하기 전에). -1'd
sotn

6
적어도 그 결과를 설명하지 않고 보안 경고를 무시하라고 사람들에게 말하는 것은 무책임합니다. -1
Eduardo Wada

58

기본적으로 ASP.NET MVC 프레임 워크에서는 악의적 인 사용자가 JSON 하이재킹이라는 프로세스를 통해 페이로드에 액세스 할 수 있으므로 JSON 페이로드로 GET 요청에 응답 할 수 없습니다. GET 요청에서 JSON을 사용하여 민감한 정보를 반환하고 싶지 않습니다.

GET에 대한 응답으로 JSON을 보내야하고 민감한 데이터를 노출하지 않는 JsonRequestBehavior.AllowGet경우 Json 메서드에 두 번째 매개 변수로 전달하여 명시 적으로 동작을 허용 할 수 있습니다 .

같은

  [HttpGet] //No need to decorate, as by default it will be GET
  public JsonResult GetMyData(){  
    var myResultDataObject = buildMyData(); // build, but keep controller thin
    // delegating buildMyData to builder/Query Builder using CQRS makes easy :)
    return Json(myResultDataObject, JsonRequestBehavior.AllowGet);
  }

다음은 Phil Haack JSON Hijacking이 GET 메서드와 함께 Json을 사용하지 않는 이유에 대한 흥미로운 기사입니다.


2
좋은 게시물입니다. HTTPS를 사용해야하는 좋은 이유입니다.
pqsk

6
HTTPS가 여기서 도움이되지 않는다고 생각합니다.
Sean McMillan

10

MVC 애플리케이션에서 클라이언트로 json 객체를 반환하려면 객체를 반환 할 때 JsonRequestBehavior.AllowGet을 명시 적으로 지정해야합니다. 결과적으로 문제를 극복하기 위해 아래와 같이 json 데이터를 반환합니다.

    return Json(yourObjectData, JsonRequestBehavior.AllowGet);

7

다음과 같이 Json Response에 JsonRequestBehavior.AllowGet을 사용해야합니다.

return Json(YourObject, JsonRequestBehavior.AllowGet);

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