프레임 버스터 버스터 ... 버스터 코드 필요
다른 사이트가 다음 사이트를 "프레임"하지 않기를 원한다고 가정 해 봅시다 <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 표준을 고려하면 공격자가 샌드 박스를 사용할 때이 페이지에서 제공하는 모든 프레임 버스 팅 코드는 iframe을 다음과 같이 제한하기 때문에 비활성화 할 수 있습니다.
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!
}
나는 용감하고이 모자에있는 고리에 모자를 던질 것입니다.
여기 내 시도가 있는데, 테스트 한 모든 곳에서 작동하는 것 같습니다 (Chrome20, IE8 및 FF14).
(function() {
if (top == self) {
return;
}
setInterval(function() {
top.location.replace(document.location);
setTimeout(function() {
var xhr = new XMLHttpRequest();
xhr.open(
'get',
'http://mysite.tld/page-that-takes-a-while-to-load',
false
);
xhr.send(null);
}, 0);
}, 1);
}());
이 코드를에 넣고 악성 코드와 논쟁하기 전에 내 페이지가 렌더링되도록하기 위해이 페이지를 <head>
호출했습니다. <body>
이것이 YMMV가 가장 좋은 방법인지 모릅니다.
어떻게 작동합니까?
... 내가 듣고 물어 - 잘 정직한 대답은, 내가하지 않습니다 정말 알고있다. 테스트하는 모든 곳에서 작동하도록 많은 혼란을 겪었으며 정확한 효과는 실행 위치에 따라 약간 다릅니다.
그 뒤에 생각이 있습니다.
- 가능한 가장 낮은 간격으로 실행되도록 기능을 설정하십시오. 내가 본 현실적인 솔루션의 기본 개념은 프레임 버스터 버스터보다 많은 이벤트로 스케줄러를 채우는 것입니다.
- 함수가 실행될 때마다 상단 프레임의 위치를 변경하십시오. 상당히 명백한 요구 사항.
- 또한 기능이 즉시 실행되도록 예약하는 데 시간이 오래 걸릴 수 있습니다 (따라서 프레임 버스터 버스터가 위치 변경을 방해하지 않도록 차단). 동기식 XMLHttpRequest는 사용자 상호 작용이 필요하지 않고 사용자의 CPU 시간을 씹지 않는 것으로 생각할 수있는 유일한 메커니즘이기 때문에 동기 XMLHttpRequest를 선택했습니다.
내 http://mysite.tld/page-that-takes-a-while-to-load
(XHR의 대상)을 위해 다음과 같은 PHP 스크립트를 사용했습니다.
<?php sleep(5);
무슨 일이야?
- XHR이 완료되는 동안 Chrome과 Firefox는 5 초 동안 기다린 다음 프레임 된 페이지의 URL로 리디렉션합니다.
- IE는 거의 즉시 리디렉션
Chrome 및 Firefox에서 대기 시간을 피할 수 없습니까?
분명히 아닙니다. 처음에는 XHR이 404를 반환하는 URL을 가리 켰습니다. Firefox에서는 작동하지 않았습니다. 그런 다음 sleep(5);
이 답변을 얻기 위해 마침내 착륙 한 접근법을 시도한 다음 다양한 방법으로 수면 길이로 놀기 시작했습니다. 나는 행동에 실제 패턴을 찾을 수는 없지만 너무 짧으면 Firefox가 공을 재생할 수 없다는 것을 알았습니다 (Chrome 및 IE는 상당히 잘 동작하는 것 같습니다). 나는 "너무 짧다"라는 정의가 실제 용어로 무엇인지 모르지만 매 5 초 마다 작동하는 것 같습니다 .
지나가는 Javascript 닌자가 어떤 일이 일어나고 있는지 더 잘 설명하고 싶다면 왜 이것이 잘못되었는지, 신뢰할 수 없으며, 최악의 코드 등을 듣게 될 것입니다.
자, 우리는 그것이 프레임 안에 있음을 알고 있습니다. 따라서 경로를 GET 변수로 사용하는 다른 특수 페이지를 location.href합니다. 이제 사용자에게 진행 상황을 설명하고 target = "_ TOP"옵션과의 링크를 제공합니다. 간단하고 아마도 작동하지는 않지만 (테스트하지는 않았지만) 사용자 상호 작용이 필요합니다. 어쩌면 당신은 사용자에게 문제의 사이트를 지적하고 어딘가에 당신의 사이트에 클릭 재커의 명예의 전당을 만들 수 있습니다.
제안 된 모든 솔루션은 상단 창의 위치를 직접 변경합니다. 사용자가 프레임을 원한다면 어떻게해야합니까? 예를 들어 검색 엔진 이미지 결과의 상단 프레임.
기본적으로 모든 입력 (링크, 양식 및 입력 요소)이 비활성화되고 활성화 될 때 아무것도하지 않는 프로토 타입을 작성했습니다.
포함하는 프레임이 감지되면 입력이 비활성화 된 상태로 유지되고 페이지 상단에 경고 메시지가 표시됩니다. 경고 메시지에는 안전한 버전의 페이지를 새 창에서 여는 링크가 포함되어 있습니다. 이렇게하면 페이지가 클릭 재킹에 사용되는 것을 방지하는 동시에 다른 상황에서는 사용자가 내용을 볼 수 있습니다.
포함 프레임이 감지되지 않으면 입력이 활성화 된 것입니다.
코드는 다음과 같습니다. 표준 HTML 속성을 안전한 값으로 설정하고 실제 값을 포함하는 추가 속성을 추가해야합니다. 아마도 불완전하고 완전한 안전을 위해 추가 속성 (이벤트 핸들러에 대해 생각하고 있음)은 동일한 방식으로 처리해야합니다.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<title></title>
<script><!--
function replaceAttributeValuesWithActualOnes( array, attributeName, actualValueAttributeName, additionalProcessor ) {
for ( var elementIndex = 0; elementIndex < array.length; elementIndex += 1 ) {
var element = array[ elementIndex ];
var actualValue = element.getAttribute( actualValueAttributeName );
if ( actualValue != null ) {
element[ attributeName ] = actualValue;
}
if ( additionalProcessor != null ) {
additionalProcessor( element );
}
}
}
function detectFraming() {
if ( top != self ) {
document.getElementById( "framingWarning" ).style.display = "block";
} else {
replaceAttributeValuesWithActualOnes( document.links, "href", "acme:href" );
replaceAttributeValuesWithActualOnes( document.forms, "action", "acme:action", function ( form ) {
replaceAttributeValuesWithActualOnes( form.elements, "disabled", "acme:disabled" );
});
}
}
// -->
</script>
</head>
<body onload="detectFraming()">
<div id="framingWarning" style="display: none; border-style: solid; border-width: 4px; border-color: #F00; padding: 6px; background-color: #FFF; color: #F00;">
<div>
<b>SECURITY WARNING</b>: Acme App is displayed inside another page.
To make sure your data is safe this page has been disabled.<br>
<a href="framing-detection.html" target="_blank" style="color: #090">Continue working safely in a new tab/window</a>
</div>
</div>
<p>
Content. <a href="#" acme:href="javascript:window.alert( 'Action performed' );">Do something</a>
</p>
<form name="acmeForm" action="#" acme:action="real-action.html">
<p>Name: <input type="text" name="name" value="" disabled="disabled" acme:disabled=""></p>
<p><input type="submit" name="save" value="Save" disabled="disabled" acme:disabled=""></p>
</form>
</body>
</html>
2015 년 기준으로 CSP2의 frame-ancestors
지시문을 사용해야 합니다. 이것은 HTTP 응답 헤더를 통해 구현됩니다.
예 :
Content-Security-Policy: frame-ancestors 'none'
물론 CSP2를 지원하는 브라우저는 많지 않으므로 이전 X-Frame-Options
헤더 를 포함하는 것이 좋습니다 .
X-Frame-Options: DENY
어쨌든 두 브라우저를 모두 포함하는 것이 좋습니다. 그렇지 않으면 사이트가 기존 브라우저의 클릭 재킹 공격에 계속 취약 해지 며 악의적 인 의도가없는 경우에도 바람직하지 않은 프레임이 생성됩니다. 요즘 대부분의 브라우저는 자동으로 업데이트되지만 레거시 응용 프로그램 호환성으로 인해 회사 사용자는 이전 버전의 Internet Explorer에 계속 갇히게됩니다.
글쎄, 당신은 카운터의 가치를 수정할 수 있지만, 그것은 명백한 취성 솔루션입니다. 사이트가 프레임 내에 있지 않다고 판단한 후에 AJAX를 통해 콘텐츠를로드 할 수 있습니다. 훌륭한 솔루션은 아니지만 on beforeload 이벤트 (나는 가정하고 있음)를 발생시키지 않기를 바랍니다.
편집 : 다른 아이디어. 프레임에있는 것을 감지하면 원하는 URL로 연결되는 링크를 클릭하기 전에 사용자에게 자바 스크립트를 비활성화하도록 요청하십시오 (쿼리 문자열을 전달하여 사용자가 한 번 자바 스크립트를 다시 활성화 할 수 있음을 사용자에게 알려줍니다) 거기 있어요).
편집 2 : 핵화-프레임에 있다고 감지되면 문서 본문 내용을 삭제하고 불쾌한 메시지를 인쇄하십시오.
편집 3 : 최상위 문서를 열거하고 모든 기능을 null로 설정 할 수 있습니까?
버스터 코드 바로 뒤에 경고를 추가하면 경고가 자바 스크립트 스레드를 중단하고 페이지가로드되도록합니다. 이것이 StackOverflow의 기능이며, 프레임 버스 팅 버스터를 사용할 때도 iframe에서 버스트됩니다. 간단한 테스트 페이지에서도 작동했습니다. 이것은 Windows의 Firefox 3.5 및 IE7에서만 테스트되었습니다.
암호:
<script type="text/javascript">
if (top != self){
top.location.replace(self.location.href);
alert("for security reasons bla bla bla");
}
</script>
거의 다 갔다고 생각합니다. 시도해 보셨습니까?
window.parent.onbeforeunload = null;
window.parent.location.replace(self.location.href);
또는 대안 적으로 :
window.parent.prevent_bust = 0;
참고 : 실제로 이것을 테스트하지 않았습니다.
버스터를 반복해서 호출하는 것은 어떻습니까? 이것은 경쟁 조건을 만들지 만 버스터가 맨 위에 나오기를 바랍니다.
(function() {
if(top !== self) {
top.location.href = self.location.href;
setTimeout(arguments.callee, 0);
}
})();
반환 된 값 setInterval()
을 보통 한 자리 숫자 로 보는 경우 일반적으로 한 줄의 코드로 모든 인터럽트를 비활성화 할 수 있습니다.
for (var j = 0 ; j < 256 ; ++j) clearInterval(j)
방금 프레임 버스터 버스터 자바 스크립트를 터뜨리는 방법을 얻었을 것입니다. 내 자바 스크립트 함수에서 getElementsByName을 사용하여 프레임 버스터와 실제 프레임 버스터 버스터 스크립트 사이에 루프를 설정했습니다. 이 게시물을 확인하십시오. http://www.phcityonweb.com/frame-buster-buster-buster-2426
setInterval 및 setTimeout은 자동 증분 간격을 만듭니다. setTimeout 또는 setInterval이 호출 될 때마다이 숫자는 1 씩 증가하므로 setTimeout을 호출하면 현재 가장 높은 값을 얻게됩니다.
var currentInterval = 10000;
currentInterval += setTimeout( gotoHREF, 100 );
for( var i = 0; i < currentInterval; i++ ) top.clearInterval( i );
// Include setTimeout to avoid recursive functions.
for( i = 0; i < currentInterval; i++ ) top.clearTimeout( i );
function gotoHREF(){
top.location.href = "http://your.url.here";
}
거의 10000 개의 동시 setIntervals 및 setTimeouts 작동이없고 setTimeout이 "last interval or timeout created + 1"을 반환하고 top.clearInterval에 여전히 액세스 할 수 있기 때문에 프레임에 대한 블랙 햇 공격을 물리 칠 수 있습니다. 위에서 설명한 웹 사이트.
하이재킹 프레임 셋, iframe 및 이미지와 같은 콘텐츠를 피하려면 htaccess를 사용하십시오.
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://www\.yoursite\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule ^(.*)$ /copyrights.html [L]
예상 대신 저작권 페이지가 표시됩니다.
참고 URL : https://stackoverflow.com/questions/958997/frame-buster-buster-buster-code-eded
'development' 카테고리의 다른 글
cp 명령으로 파일을 대상에 복사하는 데 필요한 폴더를 작성하는 방법 (0) | 2020.02.20 |
---|---|
Chrome과 같은 더 나은 브라우저로 .NET WebBrowser 컨트롤을 대체 하시겠습니까? (0) | 2020.02.20 |
Java에서 parseInt와 valueOf의 차이점은 무엇입니까? (0) | 2020.02.20 |
C ++ 11 rvalue 및 이동 의미 론적 혼란 (return statement) (0) | 2020.02.20 |
#if DEBUG vs. Conditional (“DEBUG”) (0) | 2020.02.20 |