Development Tip

JSONP는 사용하기에 안전합니까?

yourdevel 2020. 11. 11. 20:45
반응형

JSONP는 사용하기에 안전합니까?


JSONP를 사용할 때 고려해야 할 보안 문제가 있습니까?


업데이트 : JSONP는 도메인 간 요청을 수행하는 일반적인 해킹입니다. 최신 브라우저에는 이제 Cross Origin Resource Sharing이 있고 IE8 +에는 유사한 XDomainRequest가 있습니다. 자세한 내용은 http://enable-cors.org/참조하십시오 .

JSONP는 콜백을 사용할 수있는 스크립트 포함입니다. 그러나 CSRF (Cross-site request forgery)에 대해 알고 있어야 합니다.

스크립트와 서버를 제어하는 ​​한 JSONP는 스크립트 포함보다 더 이상 안전하지 않습니다. 로그인 한 사용자에게 민감한 데이터를 반환하는 JSONP 서비스가없는 경우. 악성 사이트는 서비스에 요청을 보내고 (사용자가 사이트에 로그인되어 있기를 바라며) 데이터를 검색 할 수 있습니다. 서비스는 요청의 리퍼러를 확인할 수 있지만 플래시를 사용하여 리퍼러를 스푸핑 할 수 있습니다 (Chris Moschini에게 감사드립니다).

이 시나리오를 상상해보십시오.-사용자가 인터넷 뱅킹 계정에 로그인합니다. 사용자 브라우저에 세션 쿠키 저장. 이 사이트에는 사용자와 그의 계정에 대한 민감한 정보가있는 jsonp 서비스가 있습니다. -다른 사이트는 사용자가 로그인 한 것을 알지 못하지만 추측을 통해 jsonp 서비스에 액세스 할 수 있습니다. 사용자에게 세션 쿠키가 있기 때문에 브라우저는 응답을 받게되며 사이트가 서버에 민감한 데이터를 저장하기 위해 ajax 게시를 수행하는 것을 막을 수 없습니다.

2012 년 6 월 28 일 업데이트 : CSRF 공격으로부터 보호하려면 보안 전문가의 블로그 게시물 http://erlend.oftedal.no/blog/?blogid=130을 읽어야합니다 .


예,주의해야하지만 신뢰할 수있는 서비스와 함께 적절히 사용하면 상대적으로 안전합니다.

다음은 내가 이해하는 JSONP의 보안 문제에 대한 요약입니다.

소비자의 관점에서 :

  • 지정한 JSONP 콜백에 래핑 된 예상 JSON 대신 악성 JavaScript를 반환하지 않도록 공급자를 신뢰해야합니다.
  • Google Analytics와 같은 타사 JavaScript 내장 애드온도 마찬가지입니다.
  • 제 3자가 애플리케이션에서 임의의 JavaScript를 실행할 수 있다는 점에서 XSS 공격과 유사하지만, 먼저 요청을 수행하여 제 3자를 신뢰하도록 선택해야합니다.

공급자의 관점에서 :

  • 고객의 쿠키가 요청에 존재하더라도 소비자가 귀하의 통제하에있는 웹 페이지라고 가정해서는 안됩니다. 승인 된 URL의 허용 목록에 대해 Referer 헤더를 확인하고 / 또는 쿠키 기반 인증에 의존하지 마세요.
  • CSRF / 혼동 된 대리인 공격과 유사합니다.

양쪽 모두 보안 문제가 있습니다. 가장 심각한 것은 JSONP를 포함한 사이트입니다.

제어하지 않는 다른 도메인의를 포함하는 경우 해당 도메인은 언제든지 스크립트를 변경할 수 있습니다. 그들은 자바 스크립트가 웹 페이지의 맥락에서 자신의 자바 스크립트가 할 수있는 모든 것을 수행하도록 할 수 있습니다. JSONP를 사용하면이 문제를 해결할 방법이 없습니다. 우수한 EasyDXM 라이브러리에서 가장 잘 수행되는 iframe을 사용하여 도메인 간 통신을 조사해야합니다.

JSONP를 처리하는 웹 서비스를 제공하는 경우 CSRF (Cross-Site Request Forgery)로부터 보호해야합니다. 웹 서비스가 로그인 한 사용자에게 민감한 정보를 반환하는 곳입니다. 사용자가 귀하의 사이트에 로그인 한 경우 다른 사이트는 JSONP 서비스에 대한 GET 요청을 생성 할 수 있으며 귀하의 도메인의 쿠키는 요청과 함께 제출됩니다 (본질적으로 로그인 한 사용자 인증). 도메인은 응답을 받고 민감한 데이터를 읽을 수 있습니다!

CSRF로부터 보호하는 가장 좋은 방법은 nonce (추측하기 어렵고 무작위로 생성 된 숫자)를 생성하여 세션에 저장하는 것입니다. 이 nonce를 웹 페이지의 모든 양식에 출력하고 페이지의 모든 JSONP 요청에 포함하십시오. 서버에서 nonce가 있고 요청에 올바른지 확인합니다 (GET, POST 등). 다른 도메인은이 nonce를 추측 할 수 없으므로 쿠키에도 불구하고 민감한 정보를 얻을 수 없습니다. 전송됩니다.

마지막으로 또 다른 종류의 보안 문제가 있습니다. JSONP는 브라우저에서 OAuth로 가능한 종류의 사용자 인증을 지원하지 않습니다. 물론 서버가 일종의 액세스 토큰 (예 : OAuth)을 가져 와서 사용할 수 있습니다. 그러나 브라우저에서 완전히 인증하려면 iFrame과 도메인 간 통신을 사용해야합니다. 이것이 OAuth 2.0이하는 방식이라고 생각합니다. 설정 방법은 다음과 같습니다. 사이트에서 호스팅되는 페이지는 서버에 대한 전체 액세스 권한을 갖습니다. EasyDXM을로드하고이를 사용하여 사이트에 숨겨진 iframe을 설정하고이를 사용하여 대화하는 javascript 라이브러리가 있습니다.


JSONP는 크로스 도메인을 JavaScript로 실행하는 것만으로도 안전하지 않습니다.

해결책! 해결책!

iframe, 가급적이면 샌드 박스 처리 된 iframe을 만들고 거기에 JSONP를로드합니다. 결과를 잡아서window.postMessage

그리고 예, 누군가가 평소와 같이이 아이디어를 먼저 얻었습니다. :)

블로그 게시물은 더 이상 존재하지 않지만 여기에 링크를 유지하고 있습니다 : http://beebole.com/blog/general/sandbox-your-cross-domain-jsonp-to-improve-mashup-security/
edit : 웨이 백 머신 링크

iframe 통신을 위해 window.name 해킹을 사용했지만 IE6 및 7 용이었습니다.

참고 URL : https://stackoverflow.com/questions/613962/is-jsonp-safe-to-use

반응형