[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
이제 공격자가 다음 코드를 사용하여 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!
}