프레임 버스터 버스터... 버스터 코드 필요
를 들어, 다른 가 자신의 를 ' 하겠습니다.<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을 포함하는 모든 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를 가진 페이지를 제공하므로 브라우저가 아무 곳이나 탐색하지 않습니다.
제 질문은 -- 이건 실제 문제라기보다는 자바스크립트 퍼즐에 가깝습니다 -- 어떻게 하면 프레임을 터트리는 버스터를 물리칠 수 있을까요?
몇 가지 생각을 해봤지만, 테스트에서는 아무 효과도 없었습니다.
- 중
onbeforeunload
경유의onbeforeunload = null
가 없다 - , 「」의
alert()
에게 알렸으나 .[]을 됩니다.[확인]을 클릭하면 버스트가 정상적으로 계속됩니다. - 좋을지 안 나요.
setInterval()
(타이머)
저는 JavaScript 프로그래머가 아닙니다.그래서 제가 도전하고 싶은 게 있어요.헤이 버스터, 프레임 버스터 좀 부숴줄래?
FWIW에서는 현재 대부분의 브라우저가 X-Frame-Options: deny 디렉티브를 지원하고 있습니다.이것은 스크립트가 디세이블인 경우에도 동작합니다.
의 경우(3.6.9)
https://bugzilla.mozilla.org/show_bug.cgi?id=475530httpsbugzilla.mozilla.org/.cgi?id=475530
https://developer.mozilla.org/en/The_X-FRAME-OPTIONS_response_headerhttpsdeveloper.mozilla.org/en/
Chrome / 롬웹 / 킷킷
http://blog.chromium.org/2010/01/security-in-depth-new-security-features.htmlhttpblog.chromium.org/2010/01/.html
http://trac.webkit.org/changeset/42333httptrac.webkit.org//42333
이것이 실행 가능한지 아닌지는 잘 모르겠지만, 만약 당신이 프레임을 깨지 못한다면, 그냥 경고를 표시하는 것이 어떨까요?예를 들어, 페이지가 "top page"가 아닌 경우 프레임을 깨려고 하는 setInterval 메서드를 만듭니다.3번 또는 4번 시도해도 페이지가 여전히 맨 위 페이지가 아닌 경우 메시지와 링크로 페이지 전체를 덮는 div 요소(모달 상자)를 만듭니다.
허가되지 않은 프레임 창에서 이 페이지를 보고 있습니다 - (Blah blah...잠재적인 보안 문제)
이 문제를 해결하려면 이 링크를 클릭하십시오.
최고는 아니지만, 탈출할 수 있는 방법은 없는 것 같아요.
델은 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>
파이어폭스나 오페라 브라우저에서는 동작하는 것 같습니다.
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
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>
구스타프 Rydstedt, Elie Burstein, Dan Boneh 및 Collin Jackson(2010)에 의해 원래 제안되었다.
잠시 생각해 본 결과 누가 보스인지 알 수 있을 것 같아요
if(top != self) {
window.open(location.href, '_top');
}
「」를 사용합니다._top
「」의 window.open()
같은 창에서 실행됩니다.
2015년부터는 CSP2의 지침을 사용해야 합니다.이것은 HTTP 응답 헤더를 통해 구현됩니다.
예.
Content-Security-Policy: frame-ancestors 'none'
물론 CSP2를 지원하는 브라우저는 아직 많지 않으므로 이전 헤더를 포함하는 것이 좋습니다.
X-Frame-Options: DENY
어쨌든 둘 다 포함할 것을 권장합니다.그렇지 않으면 오래된 브라우저에서는 클릭잭킹 공격에 계속 취약해지고 악의적인 의도가 없어도 물론 바람직하지 않은 프레임이 발생합니다.오늘날 대부분의 브라우저는 자동으로 업데이트되지만 기업 사용자가 기존 애플리케이션 호환성을 이유로 이전 버전의 Internet Explorer에서 벗어나지 못하는 경우가 많습니다.
제안된 모든 솔루션은 직접 상단 창의 위치를 변경합니다.사용자가 프레임을 원하는 경우 어떻게 해야 합니까?예를 들어 검색 엔진 이미지 결과의 맨 위 프레임입니다.
시제품은 기본적으로 모든 입력(링크, 양식 및 입력 요소)이 비활성화되거나 활성화 시 아무것도 수행되지 않습니다.
포함 프레임이 검출되면 입력은 비활성화 상태로 유지되며 페이지 상단에 경고 메시지가 표시됩니다.경고 메시지에는 새 창에서 페이지의 안전한 버전을 여는 링크가 포함되어 있습니다.이렇게 하면 다른 상황에서 사용자가 내용을 볼 수 있지만 페이지가 클릭재킹에 사용되는 것을 방지할 수 있습니다.
격납 프레임이 검출되지 않는 경우는, 입력이 유효하게 됩니다.
여기 암호가 있습니다.표준 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>
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);
}());
는 이 를 이 the the the the the the the the the the the the the the i에 .<head>
을 지지 the of of 의 끝에서 불렀다.<body>
하기 전에 접근법인지 알 수 없습니다.입니다. YMMV
어떻게 작동합니까?
...당신의 질문을 들었습니다.솔직히 말하자면, 저는 잘 모릅니다.테스트하는 곳이라면 어디서든 조작할 수 있도록 하기 위해 많은 시간이 걸렸고, 실제 효과는 어디서 조작하느냐에 따라 조금씩 다릅니다.
그 배경에는 다음과 같은 생각이 있습니다.
- 가능한 한 최소 간격으로 실행되도록 함수를 설정합니다.지금까지 본 현실적인 솔루션 배후에 있는 기본적인 개념은 프레임버스터 버스터보다 더 많은 이벤트를 스케줄러에 채우는 것입니다.
- 함수가 부팅될 때마다 상단 프레임의 위치를 변경해 보십시오.꽤 명백한 요구 사항입니다.
- 또한 완료에 오랜 시간이 걸리는 기능을 즉시 실행하도록 스케줄링합니다(따라서 프레임버스터-버스터가 로케이션 변경에 간섭하지 않도록 차단합니다.동기 XMLHttpRequest를 선택한 이유는 동기 XMLHttpRequest가 사용자의 조작을 필요로 하지 않고 사용자의 CPU 시간을 낭비하지 않는 유일한 메커니즘이기 때문입니다.
의 ★★★★★★★★★★★★★★의 경우http://mysite.tld/page-that-takes-a-while-to-load
) HR 타타 음음 음음 PHP hr hr hr hr 。
<?php sleep(5);
어떻게 되는 거죠?
- Chrome 및 Firefox는 XHR이 완료될 때까지 5초간 기다린 후 프레임 페이지의 URL로 성공적으로 리디렉션합니다.
- IE는 거의 즉시 리다이렉트 됩니다.
Chrome과 Firefox에서는 대기시간을 피할 수 없습니까?
아닌 것 같아요.처음에 XHR에 404를 반환하는 URL을 지정했는데 Firefox에서는 작동하지 않았습니다. 나서 나는 ★★★★★★★★★★★★★★★★★★★★★★★를 시험해 보았다.sleep(5);
이 대답을 듣고 여러 가지 방법으로 수면시간을 가지고 놀기 시작했습니다.실제 동작 패턴은 찾을 수 없었지만, 너무 짧으면 특히 Firefox가 제대로 동작하지 않는다는 것을 알았습니다(Chrome과 IE는 상당히 잘 동작하고 있는 것 같습니다).'너무 짧다'는 말이 실제로 무슨 뜻인지는 모르겠지만 매번 5초가 효과가 있는 것 같아요.
Javascript Ninja가 무슨 일이 일어나고 있는지 조금 더 자세히 설명하고 싶다면, 이것이 왜 (아마도) 틀리고, 믿을 수 없고, 그들이 본 것 중 최악의 코드인지 등을 기꺼이 들어드리겠습니다.
좋아요, 그럼 그게 프레임 안에 있었다는 건 알겠네요그럼 위치를 정하죠.href는 경로를 GET 변수로 하는 다른 특수 페이지를 참조합니다.이제 사용자에게 상황을 설명하고 target="_TOP" 옵션이 있는 링크를 제공합니다.심플하고 (테스트하지 않은) 동작할 가능성이 높지만 사용자 조작이 필요합니다.유저에게 문제의 사이트를 지적해, 클릭 잭커에 의한 사이트에서의 수치심을 나타낼 수도 있습니다.그냥 생각일 뿐인데, 밤에 효과가 있어..
카운터의 값을 변경할 수 있지만, 그것은 분명히 취약한 해결책입니다.사이트가 프레임 내에 없다고 판단되면 AJAX를 통해 콘텐츠를 로드할 수 있습니다.또한 좋은 솔루션은 아니지만 언로드 전 이벤트 발생을 피할 수 있기를 바랍니다(내 추측).
편집: 다른 아이디어입니다.프레임 내에 있는 것을 검출했을 경우는, 목적의 URL 로 이동하는 링크를 클릭하기 전에, 유저에게 Javascript 를 무효로 하도록 의뢰합니다(페이지에 javascript 를 유효하게 할 수 있는 것을 유저에게 통지하는 쿼리 스트링을 전달합니다).
편집 2: 원자력 발전 - 프레임 안에 있는 것을 발견하면 문서 본문의 내용을 삭제하고 불쾌한 메시지를 인쇄하십시오.
편집 3: 상위 문서를 열거하고 모든 기능을 null로 설정할 수 있습니까?
버스터 코드 바로 뒤에 경보를 추가하면 경보가 javascript 스레드를 정지하고 페이지가 로드됩니다.이것이 Stack Overflow의 동작이며 프레임 버스터를 사용해도 프레임에서 버스트됩니다.간단한 테스트 페이지에서도 작동했습니다.이는 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;
주의: 실제로 테스트한 것은 아닙니다.
에 반환된 setInterval()
는 보통 , , , 1행으로 디세블로 할 수 .
for (var j = 0 ; j < 256 ; ++j) clearInterval(j)
버스터에게도 몇 번이고 전화를 걸어보는 것은 어떨까요?이렇게 하면 레이스 조건이 형성되지만, 버스터가 1등을 하기를 바랄 수도 있습니다.
(function() {
if(top !== self) {
top.location.href = self.location.href;
setTimeout(arguments.callee, 0);
}
})();
방금 프레임 버스터 버스터 자바스크립트를 깰 방법을 찾은 것 같아javascript 함수의 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개의 동시 세트가 있는 것은 거의 전례가 없는 일이기 때문에인터벌과 setTimeouts가 동작하고 setTimeout이 "last interval or timeout created + 1"을 반환하고 top.clearInterval에 계속 액세스할 수 있으므로 위에서 설명한 웹 사이트에 대한 블랙햇 공격을 물리칩니다.
htaccess를 사용하여 하이재킹프레임, iframe 및 이미지 등의 콘텐츠를 회피합니다.
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://www\.yoursite\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule ^(.*)$ /copyrights.html [L]
그러면 기대했던 것과 다른 저작권 페이지가 표시됩니다.
하면 할 수 요.postMessage()
일부 도메인이 콘텐츠에 액세스하고 다른 도메인은 모두 차단하고 내용을 표시할 수 있습니다.번째로 부모는 '컨테이너 부모'에게 .contentWindow
iframe
이치노 당신의 메시지를 합니다.
window.addEventListener("message", receiveMessage, false);
function receiveMessage(event) {
// Use event.origin here like
if(event.origin == "https://perhapsyoucantrustthisdomain.com"){
// code here to block/unblock access ... a method like the one in user1646111's post can be good.
}
else{
// code here to block/unblock access ... a method like the one in user1646111's post can be good.
}
}
으로, 「이러한 기능」을 기다리는 을 랩 말아 주세요.load
벤트입입니니다
언급URL : https://stackoverflow.com/questions/958997/frame-buster-buster-buster-code-needed
'programing' 카테고리의 다른 글
Python에서는 어떻게 태플 비교가 이루어집니까? (0) | 2022.09.08 |
---|---|
컴포넌트의 div 내의 버튼에 스타일을 적용하는 방법 (0) | 2022.09.08 |
JavaScript를 사용하여 브라우저에서 Word 문서(.doc, .docx)를 렌더링하려면 어떻게 해야 합니까? (0) | 2022.09.08 |
JavaScript에 sleep/pause/wait 기능이 있습니까? (0) | 2022.09.08 |
Composer가 MariaDB 설치를 확인할 수 있습니까? (0) | 2022.09.08 |