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 überonbeforeunload = 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. :)
0 Stimmen
... wie die Verwendung von <body onbeforeunload="prevent_bust++"> anstelle von window.onbeforeunload oder so ähnlich ;]
2 Stimmen
Nun, ich sage dazu top.document.body.onbeforeunload = null; :)
10 Stimmen
Jeff, testen Sie beide Windows in derselben Domäne? Es sieht so aus, als ob Sie das tun, denn wenn nicht, dann würden Sicherheitseinschränkungen Sie daran hindern, "onBeforeUnload" zu ändern.
29 Stimmen
Nebenbei bemerkt: Wenn Sie Beispiele veröffentlichen, verwenden Sie bitte Domains wie
example.org
wie in RFC 2606 beschrieben ietf.org/rfc/rfc2606.txt1 Stimmen
@Matt Winckler - Ich stimme zu. Der Buster-Buster-Code scheint sehr unzuverlässig zu sein. Bei Tests mit Firefox 2 und 3 hatte ich das gleiche Verhalten wie Sie. In IE6, 7, 8, Safari 3, Opera 9.6 und Chrome 2 hatte es keine Auswirkungen.
0 Stimmen
@Steve Reed - while(true) friert die Seite nur ein, aber mit dieser Idee, eine kurze Pause hinzuzufügen, funktioniert es. Zu dem Zeitpunkt, an dem der Intervallcode Zugriff auf den Thread erhält, ist es zu spät, und die enthaltene Seite ist ausgebrochen.
0 Stimmen
Ich habe soeben meine Antwort aktualisiert, bitte probieren Sie es aus.
2 Stimmen
Nur aus reiner Neugierde: Warum wollen Sie das tun? Das hört sich an, als wäre es von den Leuten erfunden worden, die verhindern wollten, dass jeder mit der rechten Maustaste auf ihre Seite klickt...
2 Stimmen
youtube.com/watch?v=Iw3G80bplTg Für diejenigen, die den Bezug nicht verstehen. NSFW Profanität
0 Stimmen
Wenn Sie Ihren Buster Buster Buster testen möchten, habe ich eine Seite, die eine bestimmte URL einrahmt .
3 Stimmen
Zum allgemeinen Thema der Gegen-gegen-gegen-Maßnahmen: galactanet.com/comic/view.php?strip=209
0 Stimmen
Dieser Mann hat eine Frage zu Ihrem Frame Buster: stackoverflow.com/questions/2298439/ . Jeff oder jemand anderes sollte diesem Mann helfen.
0 Stimmen
Jeff, der frame-buster-buster-buster von stackoverflow funktioniert nicht in Chrome 10.0.634.0 dev auf Windows XP SP3. Nachdem ich auf "OK" geklickt habe, ist die Seite leer (ganz weiß) und der iframe src wird gemeldet als stackoverflow.com . Die
src
des iframe wird dynamisch festgelegt.1 Stimmen
@david wir unterstützen keine Beta-Browser Punkt.
1 Stimmen
Psh, das ist keine Beta! Es ist topaktuell! haha. Ich dachte mir nur, dass ihr das wissen wollt, da das Frame-Bustin` wahrscheinlich in ein paar Wochen/Monaten nicht mehr funktionieren wird, wenn der Stable-Channel aufholt.
2 Stimmen
Verwandte Seiten X-Frame-Optionen Mozilla spec Browserunterstützung zur Vermeidung von Clickjacking usw.
0 Stimmen
Matt, wenn du JQuery verwendest, kannst du alle Links auf deiner Seite wieder aktivieren, nachdem du den Framebuster-Buster mit etwas wie
$("a").click(function() { prevent_bust--; });
unten auf der Seite1 Stimmen
@MattWinckler, ich habe Ihr Problem, nichts anklicken zu können, repliziert. Ich habe das Intervall nach dem ersten "onbeforeunload" gelöscht, um es zu aktivieren. Da der Frame der allererste ist, der das auslöst, werden nachfolgende Ereignisse (wie z.B. ein Link-Klick) nicht mehr blockiert. Code:
var prevent_bust = 0 window.onbeforeunload = function() { prevent_bust++ } var interval = setInterval(function() { if (prevent_bust > 0) { prevent_bust -= 2; window.top.location = 'example.org/204.php'; clearInterval(interval); } }, 1);
2 Stimmen
Ein paar Iterationen später, und wir werden einen Rahmen Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster sehen. Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster Buster
0 Stimmen
Funktioniert der obige Frame Busting..buster-Code in modernen Browsern? Bei mir scheint er nicht zu funktionieren: <script>if(top != self) top.location.href = location.href;</script> Außerdem, wo finden wir einen Server, der 204 zurückgibt?
0 Stimmen
Laut dieser Antwort ist CSP heutzutage der richtige Weg: stackoverflow.com/a/31288040/339440 . Beachten Sie, dass ein entschlossener Missbraucher Ihre Seite einfach aus dem Backend abrufen und selbst vervielfältigen kann. Es gibt also keine Möglichkeit, absolut zu verhindern, dass jemand Ihre Inhalte auf seiner Website dupliziert.
0 Stimmen
Dass Busting-Frame-Busting-Code-Beispiel ist nicht deterministisch, es hängt davon ab, wer die Race-Bedingung von onbeforeunload und setInterval gewonnen, auch manchmal kann ich nicht tippen/klicken Sie etwas, kann dies für die setInterval Aufwachen alle 1 ms sein