[javascript] 프레임 버스터 버스터 … 버스터 코드 필요

다른 사이트가 다음 사이트를 “프레임”하지 않기를 원한다고 가정 해 봅시다 <iframe>.

<iframe src="http://example.org"></iframe>

따라서 모든 페이지에 프레임 방지, 프레임 버스 팅 JavaScript를 삽입합니다.

/* break us out of any containing iframes */
if (top != self) { top.location.replace(self.location.href); }

우수한! 이제 포함 된 iframe을 자동으로 “버스트”하거나 분리합니다. 작은 문제 하나만 빼고

그것이 나오는 것에 따라, 당신의 프레임 파열 코드가 파열 될 수있다 , 다음과 같이 :

<script type="text/javascript">
    var prevent_bust = 0  
    window.onbeforeunload = function() { prevent_bust++ }  
    setInterval(function() {  
      if (prevent_bust > 0) {  
        prevent_bust -= 2  
        window.top.location = 'http://example.org/page-which-responds-with-204'  
      }  
    }, 1)  
</script>

이 코드는 다음을 수행합니다.

  • 브라우저가 window.onbeforeunload이벤트 핸들러 를 통해 현재 페이지에서 탐색하려고 할 때마다 카운터를 증가시킵니다.
  • 를 통해 밀리 초마다 실행되는 타이머를 설정 setInterval()하고 카운터가 증가한 것을 발견하면 현재 위치를 공격자의 제어 서버로 변경합니다.
  • 해당 서버는 HTTP 상태 코드가 204 인 페이지를 제공 하며 브라우저는 어디에서나 탐색하지 않습니다.

내 질문은-실제 문제 보다 JavaScript 퍼즐에 가깝습니다. 프레임 버스터 버스터를 어떻게 물리 칠 수 있습니까?

몇 가지 생각이 있었지만 테스트에서 아무런 효과가 없었습니다.

  • onbeforeunload를 통해 이벤트를 지우려고 시도해 onbeforeunload = null도 아무런 효과가 없었습니다.
  • alert()중지 된 프로세스를 추가하면 사용자에게 진행 중임을 알릴 수 있지만 코드를 방해하지는 않습니다. 확인을 클릭하면 버스 팅이 정상적으로 계속됩니다
  • setInterval()타이머 를 지우는 방법을 생각할 수 없습니다

나는 JavaScript 프로그래머가 아니므로 여기 당신에게 내 도전이 있습니다 : 버스터, 프레임 버스터 버스터를 터뜨릴 수 있습니까?



답변

이것이 가능한지 확실하지 않습니다.하지만 프레임을 깰 수 없다면 왜 경고를 표시하지 않습니까? 예를 들어, 페이지가 “맨 위 페이지”가 ​​아닌 경우 프레임을 끊으려고 시도하는 setInterval 메소드를 작성하십시오. 3 또는 4 시도 후에도 여전히 페이지가 최상위 페이지가 아닌 경우 전체 페이지 (모달 상자)를 메시지와 같은 링크로 덮는 div 요소를 만듭니다.

승인되지 않은 프레임 창에서이 페이지를보고 있습니다-(Blah blah … 잠재적 보안 문제)

이 문제를 해결하려면이 링크를 클릭하십시오

최고는 아니지만 그들이 그 길을 스크립트로 만들 수있는 방법을 보지 못했습니다.


답변

FWIW에서 대부분의 최신 브라우저 는 X-Frame-Options : deny 지시문을 지원 하며 스크립트가 비활성화 된 경우에도 작동합니다.

IE8 :
http://blogs.msdn.com/ie/archive/2009/01/27/ie8-security-part-vii-clickjacking-defenses.aspx

Firefox (3.6.9)
https://bugzilla.mozilla.org/show_bug.cgi?id=475530
https://developer.mozilla.org/en/The_X-FRAME-OPTIONS_response_header

크롬 / 웹킷
http://blog.chromium.org/2010/01/security-in-depth-new-security-features.html
http://trac.webkit.org/changeset/42333


답변

우리는 http://seclab.stanford.edu/websec/framebusting/framebust.pdf 의 웹 사이트 중 하나에서 다음 접근 방식을 사용했습니다 .

<style>
 body {
 display : none
}
</style>
<script>
if(self == top) {
document.getElementsByTagName("body")[0].style.display = 'block';
}
else{
top.location = self.location;
}
</script>


답변

이 결과를 얻었고 적어도 Firefox와 Opera 브라우저에서 작동하는 것 같습니다.

if(top != self) {
 top.onbeforeunload = function() {};
 top.location.replace(self.location.href);
}


답변

iframe 용 샌드 박스를 도입 한 현재 HTML5 표준을 고려할 때이 페이지에서 제공하는 모든 프레임 버스 팅 코드는 ibox가 다음을 제한하지 않기 때문에 샌드 박스를 사용할 때 비활성화 될 수 있습니다.

allow-forms: Allow form submissions.
allow-popups: Allow opening popup windows.
allow-pointer-lock: Allow access to pointer movement and pointer lock.
allow-same-origin: Allow access to DOM objects when the iframe loaded form same origin
allow-scripts: Allow executing scripts inside iframe
allow-top-navigation: Allow navigation to top level window

참조하십시오 : http://www.whatwg.org/specs/web-apps/current-work/multipage/the-iframe-element.html#attr-iframe-sandbox

이제 공격자가 다음 코드를 사용하여 iframe에서 사이트를 호스팅한다고 가정 해보십시오.

<iframe src="URI" sandbox></iframe>

그러면 모든 JavaScript 프레임 버스 팅 코드가 실패합니다.

모든 프레임 버스 코드를 확인한 후에는이 방어 기능 만 모든 경우에 작동합니다.

<style id="antiClickjack">body{display:none !important;}</style>
<script type="text/javascript">
   if (self === top) {
       var antiClickjack = document.getElementById("antiClickjack");
       antiClickjack.parentNode.removeChild(antiClickjack);
   } else {
       top.location = self.location;
   }
</script>

Gustav Rydstedt, Elie Bursztein, Dan Boneh 및 Collin Jackson 이 처음 제안한 것 (2010)


답변

잠시 동안 이것을 숙고 한 후에 나는 이것이 누가 상사인지 보여줄 것이라고 믿는다.

if(top != self) {
  window.open(location.href, '_top');
}

_top대상 매개 변수로 사용 window.open()하면 동일한 창에서 실행됩니다.


답변

if (top != self) {
  top.location.replace(location);
  location.replace("about:blank"); // want me framed? no way!
}