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.

Jason Cohen
quelle
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/

fasih.rana
quelle
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".

Pankrat
quelle
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
3
Hier ist das Gegenmittel: blogs.msdn.com/b/ieinternals/archive/2010/03/30/…
Pankrat
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>
Adigioia
quelle
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
8

Nach dem Lesen der w3.org-Spezifikation . Ich habe die Sandbox-Eigenschaft gefunden.

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

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

Parris
quelle
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.

Luis Deleon
quelle
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

:((

user47087
quelle
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.

radu
quelle
0

Auf diese Weise können Sie alle Aktionen der gerahmten Seite steuern, die Sie nicht ausführen können. Es gilt die Ursprungsrichtlinie für dieselbe Domain .

Diodeus - James MacFarlane
quelle
20
Ich möchte nicht kontrollieren, was sich im IFRAME befindet. Ich möchte verhindern , dass das, was sich im IFRAME befindet, mich kontrolliert.
Jason Cohen