it-swarm.com.de

So verhindern Sie, dass IFRAME das Fenster der obersten Ebene umleitet

Einige Websites haben Code zum "Ausbrechen" von IFRAME - Anlagen, dh wenn eine Seite A als IFRAME innerhalb einer übergeordneten Seite P geladen wird Javascript in A leitet das äußere Fenster zu A um.

In der Regel sieht Javascript so aus:

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

Meine Frage lautet: Wie kann ich verhindern, dass P als Autor der übergeordneten Seite A und nicht als Autor der inneren Seite A diesen Ausbruch vornimmt?

P.S. Mir scheint, es sollte eine standortübergreifende Sicherheitsverletzung sein, aber das ist es nicht.

121
Jason Cohen

Versuchen Sie es mit der Eigenschaft onbeforeunload, mit der der Benutzer auswählen kann, ob er von der Seite weg navigieren möchte.

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

In HTML5 können Sie die Sandbox-Eigenschaft verwenden. Bitte lesen Sie die Antwort von Pankrat weiter unten. http://www.html5rocks.com/de/tutorials/security/sandboxed-iframes/

40
fasih.rana

Mit HTML5 wurde das Attribut iframe sandbox hinzugefügt. Zum Zeitpunkt des Schreibens dieses funktioniert auf Chrome, Safari, Firefox und den neuesten Versionen von IE und Opera aber macht so ziemlich das, was Sie wollen:

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

Wenn Sie Weiterleitungen auf oberster Ebene zulassen möchten, geben Sie sandbox="allow-top-navigation".

120
Pankrat

Ich benutze sandbox = "..."

  • formulare zulassen ermöglicht die Übermittlung von Formularen
  • allow-popups erlaubt Popups
  • allow-pointer-lock ermöglicht die Zeigersperre
  • allow-same-Origin ermöglicht es dem Dokument, seinen Ursprung beizubehalten
  • allow-scripts ermöglicht die Ausführung von JavaScript und das automatische Auslösen von Features
  • allow-top-navigation ermöglicht es dem Dokument, durch Navigieren im Fenster der obersten Ebene aus dem Frame auszubrechen

Top-Navigation ist das, was Sie verhindern möchten, also lassen Sie das weg und es wird nicht erlaubt. Alles, was weggelassen wird, wird blockiert.

ex.

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

Nach dem Lesen der w3.org spec . Ich habe die Sandkasteneigenschaft gefunden.

Sie können sandbox="", wodurch verhindert wird, dass der Iframe umgeleitet wird. Davon abgesehen leitet es den Iframe auch nicht weiter. Sie werden den Klick im Wesentlichen verlieren.

Beispiel hier: http://jsfiddle.net/ppkzS/1/
Beispiel ohne Sandbox: http://jsfiddle.net/ppkzS/

7
Parris

Ich weiß, dass es lange her ist, dass die Frage gestellt wurde, aber hier ist meine verbesserte Version, die 500 ms auf jeden nachfolgenden Aufruf wartet, nur wenn der Iframe geladen ist.

<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>

und onload="frameLoad()" und onreadystatechange="frameLoad();" müssen zum Frame oder iFrame hinzugefügt werden.

4
Luis Deleon
3
artur

In meinem Fall möchte ich, dass der Benutzer die innere Seite besucht, damit der Server seine IP als Besucher sieht. Wenn ich die PHP-Proxy-Technik verwende, denke ich, dass die innere Seite meine Server-IP als Besucher sieht, also ist es nicht gut. Die einzige Lösung, die ich bisher gefunden habe, ist die vor dem Laden. Tragen Sie dies auf Ihre Seite ein:

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

Dies funktioniert sowohl in Firefox als auch in dem, was ich getestet habe. Sie finden Versionen mit so etwas wie evt.return (was auch immer) Mist ..., der in Firefox nicht funktioniert.

2
radu

Da die Seite, die Sie im iframe laden, den Code "break out" mit einem setInterval ausführen kann, ist onbeforeunload möglicherweise nicht so praktisch, da der Benutzer mit "Sind Sie sicher, dass Sie das Programm verlassen möchten?" Dialoge.

Es gibt auch das iframe-Sicherheitsattribut, das nur für IE & Opera funktioniert

:(

2
user47087

Auf diese Weise können Sie alle Aktionen der gerahmten Seite steuern, die Sie nicht ausführen können. Same-Domain Origin-Richtlinie gilt.