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

211voto

6 Stimmen

Hervorragend, die Unterstützung in der .exe des Browsers ist ohne Zweifel der richtige Weg. Wenn Sie von "den meisten Browsern" sprechen, welche sind das genau? Ich kann keine guten Quellen für alles außer IE8 finden.

2 Stimmen

Hier ist eine Testseite: enhanceie.com/test/clickjack . Chrome 4.1.249.1042 unterstützt. Opera 10.50 unterstützt. Firefox 3.6.2 wird noch nicht unterstützt. Safari 4.0.3 unterstützt.

1 Stimmen

Firefox 3.6.9 wird es nativ unterstützen ( hackademix.net/2010/08/31/… ) und jede Firefox-Installation mit NoScript hat es seit Anfang 2009 ( hackademix.net/2009/01/29/x-frame-options-in-firefox )

150voto

hugoware Punkte 34313

Ich bin mir nicht sicher, ob das machbar ist oder nicht - aber wenn man den Rahmen nicht aufbrechen kann, warum nicht einfach eine Warnung anzeigen. Zum Beispiel, wenn Ihre Seite ist nicht die "Top-Seite" erstellen Sie eine setInterval Methode, die versucht, den Rahmen zu brechen. Wenn Ihre Seite nach 3 oder 4 Versuchen immer noch nicht die erste Seite ist, erstellen Sie ein div-Element, das die gesamte Seite (modale Box) mit einer Nachricht und einem Link wie...

Sie sehen diese Seite in einem nicht autorisierten Frame-Fenster - (Blah blah... mögliches Sicherheitsproblem)

Klicken Sie auf diesen Link, um dieses Problem zu beheben

Nicht die beste, aber ich sehe keine Möglichkeit, wie sie sich da herauswinden könnten.

2 Stimmen

Ich habe das ausprobiert und es funktioniert. Ein weiterer Punkt, der mir an dieser Lösung gefällt, ist, dass sie dem Benutzer zeigt, auf welcher Art von Website er/sie war, bevor er/sie zu Ihrem Inhalt ging. Codebeispiel: if (parent.frames.length > 0) { top.location.replace(document.location); setTimeout(function() { if (parent.frames.length > 0) { document.location = " google.de "; } }, 10); }

0 Stimmen

Dies ist nicht nur ein guter Weg, um Missbrauch zu vermeiden, sondern auch sehr freundlich gegenüber Websites, die Ihre Website in einen Rahmen einbetten möchten, um einen Blick darauf zu werfen, aber nicht, um ihre Nutzung zu erlauben. Idealerweise sollte ein Screenshot der Homepage der Website verwendet werden, mit einer Erklärung, warum die Website nicht im Iframe verwendet werden kann, darüber.

34 Stimmen

So macht es Facebook.

38voto

Dungeon Hunter Punkte 18931

Wir haben den folgenden Ansatz auf einer unserer Websites von http://seclab.stanford.edu/websec/framebusting/framebust.pdf

<style>
 body { 
 display : none   
}
</style>
<script>
if(self == top) {
document.getElementsByTagName("body")[0].style.display = 'block';
}
else{
top.location = self.location;
}
</script>

4 Stimmen

Bingo! Ich bin mir nicht sicher, warum das nicht mehr hochgevotet wird, da es die beste Antwort ist (neben der Antwort X-Frame-Options, aber es ist am besten, beide zu kombinieren)

2 Stimmen

Diese Antwort oder meine sollte ausgewählt werden :)

0 Stimmen

Mir gefällt Ihre Idee, sowohl diese als auch die Antwort X-Frame-Options:deny zu verwenden.

29voto

Jani Hartikainen Punkte 41573

Ich habe mir das hier ausgedacht, und es scheint zu funktionieren, zumindest in Firefox und im Opera-Browser.

if(top != self) {
 top.onbeforeunload = function() {};
 top.location.replace(self.location.href);
}

3 Stimmen

Sowohl Janis als auch Jeffs Lösung (nach der Bearbeitung) sind korrekt und funktionieren gleichwertig; Jani erhält den Zuschlag, weil seine Lösung ohne Bearbeitung richtig funktioniert hat

29 Stimmen

Dies funktioniert nur, wenn die beiden Fenster zur gleichen Domäne gehören, was nur selten vorkommt, wenn Sie aus einem Rahmen ausbrechen wollen.

0 Stimmen

Wenn verschachtelte Frames beteiligt sind, müssen Sie die Frame-Kette durchlaufen und alle onbeforeunload Handlanger, nicht nur der oberste!

20voto

Josh Stodola Punkte 79569

Nachdem ich eine Weile darüber nachgedacht habe, glaube ich, dass dies ihnen zeigen wird, wer der Boss ist...

if(top != self) {
  window.open(location.href, '_top');
}

Verwendung von _top als Zielparameter für window.open() wird es im selben Fenster gestartet.

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