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. :)

4voto

Marius Punkte 55729

Wenn Sie eine Warnung direkt nach dem Buster-Code hinzufügen, wird die Warnung den Javascript-Thread stoppen und die Seite laden lassen. Dies ist, was StackOverflow tut, und es sprengt aus meiner iframes, auch wenn ich die Frame-Busting-Buster verwenden. Es hat auch mit meiner einfachen Testseite funktioniert. Dies wurde nur in Firefox 3.5 und IE7 unter Windows getestet.

Code:

<script type="text/javascript">
if (top != self){
  top.location.replace(self.location.href);
  alert("for security reasons bla bla bla");
}
</script>

3voto

Jeff Meatball Yang Punkte 35809

Ich glaube, Sie waren fast am Ziel. Haben Sie es versucht:

window.parent.onbeforeunload = null;
window.parent.location.replace(self.location.href);

oder alternativ dazu:

window.parent.prevent_bust = 0;

Hinweis: Ich habe dies nicht wirklich getestet.

1 Stimmen

Ich habe Ihr Code-Beispiel bearbeitet (der Test für Elternteil scheint zu scheitern), aber die bearbeitete Version scheint zu funktionieren!

1 Stimmen

Cool. Es ist immer schwierig, mit ungetestetem Code zu antworten - ich tue es, um wenigstens die Idee zu vermitteln und den armen Fragesteller debuggen zu lassen :)

13 Stimmen

Funktioniert nicht, wenn das Elternteil auf einer anderen Domain ist, was wahrscheinlich der Fall ist!

3voto

Robin Nixon Punkte 31

Wenn Sie sich die Werte ansehen, die von setInterval() Sie sind in der Regel einstellig, so dass Sie in der Regel alle diese Interrupts mit einer einzigen Codezeile deaktivieren können:

for (var j = 0 ; j < 256 ; ++j) clearInterval(j)

2voto

Christoph Punkte 157217

Wie wäre es, wenn Sie den Buster auch wiederholt aufrufen? Das führt zu einer Wettlaufsituation, aber man kann hoffen, dass der Buster am Ende die Oberhand behält:

(function() {
    if(top !== self) {
        top.location.href = self.location.href;
        setTimeout(arguments.callee, 0);
    }
})();

2voto

Phcityonweb Punkte 21

Ich habe vielleicht gerade einen Weg gefunden, das Frame-Buster-Buster-Javascript zu sprengen. Mit der getElementsByName in meinem Javascript-Funktion, habe ich eine Schleife zwischen dem Frame-Buster und der tatsächlichen Frame-Buster-Buster-Skript gesetzt. überprüfen Sie diesen Beitrag aus. http://www.phcityonweb.com/frame-buster-buster-buster-2426

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