438 Stimmen

Frame Buster Buster ... Buster-Code erforderlich

Angenommen, Sie möchten nicht, dass andere Websites Ihre Website in einem "Frame" anzeigen. <iframe> :

<iframe src="http://example.org"></iframe>

Sie fügen also ein Anti-Framing-JavaScript in alle Ihre Seiten ein, das Frames aufhebt:

/* break us out of any containing iframes */
if (top != self) { top.location.replace(self.location.href); }

Ausgezeichnet! Jetzt "sprengen" oder brechen Sie automatisch aus jedem enthaltenen iframe aus. Es gibt nur ein kleines Problem.

Wie sich herausstellte, Ihr Frame-Busting-Code kann geknackt werden , wie hier gezeigt :

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

Dieser Code bewirkt Folgendes:

  • erhöht einen Zähler jedes Mal, wenn der Browser versucht, von der aktuellen Seite weg zu navigieren, über die window.onbeforeunload Ereignisbehandler
  • richtet einen Timer ein, der jede Millisekunde über setInterval() und wenn er sieht, dass der Zähler erhöht wird, ändert er den aktuellen Standort zu einem Server, den der Angreifer kontrolliert
  • dass der Server eine Seite mit dem HTTP-Statuscode 204 was den Browser nicht dazu veranlasst, irgendwo zu navigieren

Meine Frage ist - und dies ist mehr ein JavaScript-Rätsel als eine tatsächliche Problem -- wie kann man den Frame-Buster besiegen?

Ich habe mir ein paar Gedanken gemacht, aber bei meinen Tests hat nichts funktioniert:

  • der Versuch, die onbeforeunload Veranstaltung über onbeforeunload = null hatte keine Wirkung
  • Hinzufügen eines alert() das Anhalten des Prozesses lässt den Benutzer wissen, dass es passiert, greift aber in keiner Weise in den Code ein; wenn Sie auf OK klicken, wird das Busting normal fortgesetzt
  • Mir fällt keine Möglichkeit ein, die setInterval() Zeitschaltuhr

Ich bin kein großer JavaScript-Programmierer, also hier ist meine Herausforderung für Sie: Hey Buster, kannst du den Frame-Busting-Buster sprengen?

0 Stimmen

Ich habe im Moment nicht die Möglichkeit, dies zu testen, aber es scheint, dass die einzige Möglichkeit, den sehr schnellen Timer auf der oberen Seite zu blockieren, darin besteht, den einzigen Javascript-Thread, den der Browser hat, mit einer Endlosschleife aktiv zu blockieren. Was ich nicht weiß, ist, ob der Browser in der Lage sein wird, die obere Seite neu zu laden, während dies geschieht. top.location.replace(self.location.href); while(true) { }

6 Stimmen

Ich bin mir nicht sicher, ob der Frame-Buster-Buster tatsächlich funktioniert... wenn ich versuche, ihn zu testen (indem ich auf einen Handler umleite, den ich so eingestellt habe, dass er einen 204 zurückgibt), hindert er mich am Navigieren überall außerhalb der Seite - einschließlich der Eingabe von Daten in die Adressleiste! Ich muss die Browser-Registerkarte schließen und eine neue öffnen, um weiterzukommen. Mit anderen Worten: Ich bin mir nicht sicher, ob das Problem gelöst werden muss, denn der Frame-Buster, der gestoppt werden soll, ist bereits gestoppt... :) (Entweder das oder ich habe meinen Test vermasselt, was nie passieren könnte...) ;)

16 Stimmen

Matt, der oben gepostete Code für den Frame-Buster-Buster definitiv funktioniert. Ein äh Freund von mir hat mir davon erzählt. Oder so. :)

0voto

cwallenpoole Punkte 75701

SetInterval und setTimeout erzeugen ein automatisch inkrementierendes Intervall. Jedes Mal, wenn setTimeout oder setInterval aufgerufen wird, erhöht sich diese Zahl um eins, so dass Sie beim Aufruf von setTimeout den aktuellen, höchsten Wert erhalten.

   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";
   }

Da es fast unmöglich ist, dass 10000 setIntervals und setTimeouts gleichzeitig funktionieren, und da setTimeout "last interval or timeout created + 1" zurückgibt, und da top.clearInterval immer noch zugänglich ist, wird dies die oben beschriebenen Black-Hat-Angriffe auf Frame-Websites vereiteln.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X