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


133

Einige Websites verfügen über Code zum "Ausbrechen" von IFRAMEGehäusen. Wenn eine Seite Aals IFRAMEin eine übergeordnete Seite geladen wird, leitet PJavascript in Adas äußere Fenster weiter A.

Normalerweise sieht dieses Javascript ungefähr 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 als Autor der übergeordneten Seite Pund nicht als Autor der inneren Seite diesen Ausbruch Averhindern A?

PS Es scheint mir, dass es sich um eine Cross-Site-Sicherheitsverletzung handeln sollte, ist es aber nicht.


Ich glaube nicht, dass Sie überhaupt viel tun können ... wenn Sie nicht der Autor des Frame-Inhalts sind.
Scunliffe

Antworten:


43

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 sehen Sie Pankrats Antwort unten. http://www.html5rocks.com/de/tutorials/security/sandboxed-iframes/


1
iFrames tun erlaubt Cross-Domain - Kommunikation, aber mit postMessage. Dies ist kein Sicherheitsrisiko, aber jemand möchte vielleicht wissen, dass diese Funktion vorhanden ist, wenn er Ihren Kommentar sieht. :)
Coreyward

Zum Zeitpunkt des Schreibens dieser Antwort war dies nicht möglich. Vielen Dank für den Hinweis.
fasih.rana

@ SirDarius könnten Sie bitte ein Beispiel zeigen, sehr geschätzt.
user198989

Der Benutzer weiß nicht, warum diese Bestätigung angezeigt wird, und wählt wahrscheinlich eine zufällige Antwort aus. Ich empfehle es nicht. Es gibt andere Lösungen - die sandbox.
Oriadam

1
@ fasih.rana Der zweite Artikel hat mir sehr geholfen. Vielen Dank;)
MrD

127

Mit HTML5 wurde das iframe-Sandbox- Attribut hinzugefügt. Zum Zeitpunkt des Schreibens funktioniert dies unter Chrome, Safari, Firefox und neueren Versionen von IE und Opera , macht aber so ziemlich das, was Sie wollen:

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

Wenn Sie Weiterleitungen der obersten Ebene zulassen möchten, geben Sie an sandbox="allow-top-navigation".


warte was? Sie lassen dich das machen? Ich dachte, wenn eine Website ausbrechen wollte, würden es alle Browser zulassen. Wie sollen die Leute damit ihre Website von Iframes fernhalten? Ich beschwere mich aber nicht, großartig.
Farzher


1
@StephenSarcsamKamenar Wenn Sie Ihre Site vor der Anzeige im Iframe schützen möchten, ist der Header X-Frame-Options mit dem Wert SAMEORIGIN verfügbar . Die meisten modernen Browser zeigen die Site im Iframe mit diesem Header nicht an.
Grzegorz

4
Leider sandboxist Flash oder ein anderer Objekttyp im Sandbox-Rahmen nicht sandboxzulässig , sodass die Funktion in vielen Fällen unbrauchbar wird.
Oriadam

1
Websites sollten nicht "ausbrechen", um gegen die Aufnahme in einen Iframe zu protestieren. Sie können einfach eine Nachricht anzeigen oder leer werden. Wenn Sie Skripte im Iframe ausführen lassen, können Sie leider immer noch einen betrügerischen Iframe ausführen, der (1) {} und andere Endlosschleifen ausführt. Ich wünschte, jeder Iframe könnte seinen eigenen Thread bekommen.
Gregory Magarshak

51

Ich benutze sandbox = "..."

  • allow-Formulare ermöglicht das Einreichen von Formularen
  • allow-popups erlaubt Popups
  • Erlaube-Zeigersperre erlaubt Zeigersperre
  • Mit allow-same-origin kann das Dokument seinen Ursprung beibehalten
  • allow-scripts ermöglicht die Ausführung von JavaScript und das automatische Auslösen von Funktionen
  • Mit der Option "Top-Navigation zulassen" kann das Dokument durch Navigieren im Fenster der obersten Ebene aus dem Rahmen ausbrechen

Top-Navigation ist das, was Sie verhindern möchten. Lassen Sie dies also weg und es wird nicht zugelassen. Alles, was ausgelassen wird, wird blockiert

Ex.

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

3
Beachten Sie, dass Flash (und alle anderen Objekte) ebenfalls blockiert werden, ohne dass dies zugelassen werden kann. Diese "Sicherheitsfunktion" hindert mich daran, Sandbox insgesamt zu verwenden
Oriadam


4

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 dem Frame oder Iframe hinzugefügt werden.



2

Da die Seite, die Sie in den Iframe laden, den "Breakout" -Code mit einem setInterval ausführen kann, ist onbeforeunload möglicherweise nicht so praktisch, da der Benutzer mit "Sind Sie sicher, dass Sie gehen möchten?" Dialoge.

Es gibt auch das iframe-Sicherheitsattribut, das nur unter IE & Opera funktioniert

:((


2

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 bekommen habe, ist vor dem Laden. Setzen Sie dies auf Ihre Seite:

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

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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.