IFRAME이 최상위 창을 리디렉션하지 못하게하는 방법


133

일부 웹 사이트에는 IFRAME인클로저 를 "분리"하는 코드가 있습니다. 즉, 페이지 AIFRAME상위 페이지 내부에 로드되면 P일부 Javascript A가 외부 창을 로 리디렉션합니다 A.

일반적으로이 Javascript는 다음과 같습니다.

<script type="text/javascript">
  if (top.location.href != self.location.href)
     top.location.href = self.location.href;
</script>

내 질문은 : 부모 페이지 P의 작성자이면서 내부 페이지의 저자가 아닌 경우이 분류를 수행 A하지 못하게하려면 어떻게 A해야합니까?

추신 : 그것은 사이트 간 보안 위반이되어야하는 것처럼 보이지만 그렇지 않습니다.


나는 당신이 프레임 컨텐츠의 저자가 아니라면 당신이 전혀 할 수 있다고 생각하지 않습니다.
scunliffe

답변:


43

onbeforeunload 속성을 사용하면 사용자가 페이지를 탐색할지 여부를 선택할 수 있습니다.

예 : https://developer.mozilla.org/en-US/docs/Web/API/Window.onbeforeunload

HTML5에서는 샌드 박스 속성을 사용할 수 있습니다. 아래 Pankrat의 답변을 참조하십시오. http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/


1
그러나 iFrame 은을 사용하여 도메인 간 통신을 허용합니다 postMessage. 이것은 보안 위험이 아니지만 누군가가 사용자의 의견을 볼 때이 기능이 존재한다는 것을 알고 싶어 할 수도 있습니다. :)
coreyward

이 답변을 작성할 당시에는 불가능했습니다. 지적 해 주셔서 감사합니다.
fasih.rana

@SirDarius 매우 감사하는 예를 보여 주시겠습니까?
user198989

사용자는이 확인이 나타나는 이유를 알 수 없으며 임의 응답을 선택합니다. 나는 그것을 사용하지 않는 것이 좋습니다. 다른 솔루션이 sandbox있습니다.
oriadam

1
@ fasih.rana 두 번째 기사는 많은 도움이되었습니다. 감사합니다;)
MrD

127

HTML5에서는 iframe 샌드 박스 속성이 추가되었습니다. 글을 쓰는 시점에서 이것은 Chrome, Safari, Firefox 및 최신 버전의 IE 및 Opera에서 작동 하지만 원하는 것을 거의 수행합니다.

<iframe src="url" sandbox="allow-forms allow-scripts"></iframe>

최상위 리디렉션 을 허용 하려면을 지정하십시오 sandbox="allow-top-navigation".


무엇을 기다립니다? 그들은 당신이 할 수 있도록? 웹 사이트를 개척하고 싶다면 모든 브라우저에서 허용 할 것이라고 생각했습니다. 사람들은 어떻게이 웹 사이트를 iframe에서 차단해야합니까? 그래도 불평하지 않습니다.
Farzher December

3
해독제는 다음과 같습니다. blogs.msdn.com/b/ieinternals/archive/2010/03/30/…
Pankrat

1
@StephenSarcsamKamenar iframe에 사이트가 표시되지 않도록 하려면 SAMEORIGIN 값으로 X-Frame-Options 헤더를 사용할 수 있습니다 . 대부분의 최신 브라우저는이 헤더를 사용하여 iframe에 사이트를 표시하지 않습니다.
Grzegorz

4
안타깝게도 sandbox샌드 박스 프레임에 Flash 또는 기타 유형의 객체를 허용하지 않으므로 sandbox많은 경우이 기능을 사용할 수 없습니다.
oriadam

1
웹 사이트가 iframe에 포함되는 것에 항의하기 위해 "해체"되어서는 안됩니다. 단순히 메시지를 표시하거나 비워 둘 수 있습니다. 불행히도, iframe에서 스크립트를 실행하면 while (1) {} 및 기타 무한 루프를 수행하는 악성 iframe이 계속 열립니다. 각 iframe이 자체 스레드를 얻을 수 있기를 바랍니다.
Gregory Magarshak

51

sandbox = "..."를 사용합니다

  • allow-forms는 양식 제출을 허용합니다
  • 팝업 허용 팝업 허용
  • 포인터 허용 잠금 포인터 잠금 허용
  • allow-same-origin을 사용하면 문서의 출처를 유지할 수 있습니다
  • 스크립트 허용은 JavaScript 실행을 허용하고 기능이 자동으로 트리거되도록합니다.
  • 최상위 탐색 허용은 최상위 창을 탐색하여 문서가 프레임에서 벗어나도록합니다.

상단 탐색은 방지하려는 것이므로 그대로두면 허용되지 않습니다. 빠진 것은 차단됩니다

전의.

        <iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms" src="http://www.example.com"</iframe>

3
플래시 (및 기타 객체)도 허용 할 수있는 옵션없이 차단됩니다. 이 "보안 기능"으로 인해 샌드 박스를 함께 사용할 수 없습니다.
oriadam


4

나는 질문이 끝난 지 오랜 시간이 걸렸다는 것을 알고 있지만 여기에는 iframe 이로 드 될 때만 후속 호출을 위해 500ms를 기다리는 개선 된 버전이 있습니다.

<script type="text/javasript">
var prevent_bust = false ;
    var from_loading_204 = false;
    var frame_loading = false;
    var prevent_bust_timer = 0;
    var  primer = true;
    window.onbeforeunload = function(event) {
        prevent_bust = !from_loading_204 && frame_loading;
        if(from_loading_204)from_loading_204 = false;
        if(prevent_bust){
            prevent_bust_timer=500;
        }
    }
    function frameLoad(){
        if(!primer){
            from_loading_204 = true;
            window.top.location = '/?204';
            prevent_bust = false;
            frame_loading = true;
            prevent_bust_timer=1000;
        }else{
            primer = false;
        }
    }
    setInterval(function() {  
        if (prevent_bust_timer>0) {  
            if(prevent_bust){
                from_loading_204 = true;
                window.top.location = '/?204';
                prevent_bust = false;
            }else if(prevent_bust_timer == 1){
                frame_loading = false;
                prevent_bust = false;
                from_loading_204 = false;
                prevent_bust_timer == 0;
            }



        }
        prevent_bust_timer--;
        if(prevent_bust_timer==-100) {
            prevent_bust_timer = 0;
        }
    }, 1);
</script>

onload="frameLoad()"onreadystatechange="frameLoad();"프레임 또는 iframe에 추가해야합니다.



2

iframe 내부에로드 된 페이지는 setInterval을 사용하여 "분할"코드를 실행할 수 있으므로 '실제로두고 싶습니까?' 대화 상자.

IE & Opera에서만 작동하는 iframe 보안 속성도 있습니다

:(


2

제 경우에는 사용자가 내부 페이지를 방문하여 서버가 IP를 방문자로 볼 수 있기를 원합니다. PHP 프록시 기술을 사용하면 내부 페이지에 내 서버 IP가 방문자로 표시되므로 좋지 않습니다. 내가 지금까지 얻은 유일한 해결책은 wilth onbeforeunload입니다. 이것을 페이지에 넣으십시오.

<script type="text/javascript">
    window.onbeforeunload = function () {                       
         return "This will end your session";
    }
</script>

이것은 파이어 폭스와 즉, 내가 테스트 한 것에서 모두 작동합니다. 파이어 폭스에서는 작동하지 않는 evt.return (whatever) crap과 같은 것을 사용하는 버전을 찾을 수 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.