Angenommen, Sie möchten nicht, dass andere Websites Ihre Website in einem Rahmen "rahmen" <iframe>
:
<iframe src="http://example.org"></iframe>
So fügen Sie in alle Ihre Seiten Anti-Framing- und Frame-Busting-JavaScript ein:
/* break us out of any containing iframes */
if (top != self) { top.location.replace(self.location.href); }
Ausgezeichnet! Jetzt "kaputt" oder brechen Sie automatisch aus einem enthaltenen Iframe aus. Bis auf ein kleines Problem.
Wie sich herausstellt, den Rahmen sprengenden Code kann gesprengt 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 führt Folgendes aus:
- Erhöht einen Zähler jedes Mal, wenn der Browser versucht, über den
window.onbeforeunload
Ereignishandler von der aktuellen Seite weg zu navigieren - Richtet einen Timer ein, der jede Millisekunde über
setInterval()
ausgelöst wird. Wenn der Zähler erhöht wird, wird der aktuelle Speicherort in einen Server geändert, auf den der Angreifer zugreifen kann - Dieser Server stellt eine Seite mit dem HTTP-Statuscode 204 bereit , wodurch der Browser nirgendwo navigiert
Meine Frage ist - und dies ist eher ein JavaScript-Rätsel als ein tatsächliches Problem -, wie Sie den Frame-Busting-Buster besiegen können.
Ich hatte ein paar Gedanken, aber bei meinen Tests hat nichts funktioniert:
- Der Versuch, das
onbeforeunload
Ereignis über zu löschen,onbeforeunload = null
hatte keine Auswirkung - Durch Hinzufügen eines
alert()
gestoppten Prozesses wurde der Benutzer darüber informiert, dass der Vorgang ausgeführt wurde, der Code wurde jedoch in keiner Weise beeinträchtigt. Wenn Sie auf OK klicken, wird das Busting wie gewohnt fortgesetzt - Ich kann mir keine Möglichkeit vorstellen, den
setInterval()
Timer zu löschen
Ich bin kein großer JavaScript-Programmierer, daher ist hier meine Herausforderung an Sie: Hey Buster, können Sie den Frame-Busting-Buster kaputt machen?
quelle
example.org
in RFC 2606 angegeben. Ietf.org/rfc/rfc2606.txtAntworten:
Ich bin mir nicht sicher, ob dies möglich ist oder nicht - aber wenn Sie den Rahmen nicht brechen können, warum nicht einfach eine Warnung anzeigen. Wenn Ihre Seite beispielsweise nicht die "oberste Seite" ist, erstellen Sie eine setInterval-Methode, die versucht, den Frame zu unterbrechen. Wenn Ihre Seite nach 3 oder 4 Versuchen immer noch nicht die oberste Seite ist, erstellen Sie ein div-Element, das die gesamte Seite (modales Feld) mit einer Nachricht und einem Link wie ...
Nicht das Beste, aber ich sehe keine Möglichkeit, wie sie sich daraus herausarbeiten können.
quelle
document.write("");
FWIW, die meisten aktuellen Browser unterstützen die X-Frame-Optionen: Verweigern- Direktive, die auch funktioniert, wenn das Skript deaktiviert ist.
IE8:
http://blogs.msdn.com/ie/archive/2009/01/27/ie8-security-part-vii-clickjacking-defenses.aspx
Firefox (3.6.9)
https://bugzilla.mozilla.org/show_bug.cgi?id=475530
https://developer.mozilla.org/en/The_X-FRAME-OPTIONS_response_header
Chrome / Webkit
http://blog.chromium.org/2010/01/security-in-depth-new-security-features.html
http://trac.webkit.org/changeset/42333
quelle
Wir haben den folgenden Ansatz auf einer unserer Websites unter http://seclab.stanford.edu/websec/framebusting/framebust.pdf verwendet
quelle
Kam damit auf und es scheint zumindest in Firefox und dem Opera-Browser zu funktionieren.
quelle
onbeforeunload
durchlaufen und alle Handler entfernen , nicht nur den oben genannten!In Anbetracht des aktuellen HTML5-Standards, der Sandbox für Iframe eingeführt hat, können alle auf dieser Seite bereitgestellten Frame-Busting-Codes deaktiviert werden, wenn der Angreifer Sandbox verwendet, da dadurch der Iframe wie folgt eingeschränkt wird:
Bitte sehen Sie: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-iframe-element.html#attr-iframe-sandbox
Stellen Sie sich nun vor, der Angreifer hat den folgenden Code verwendet, um Ihre Site in iframe zu hosten:
Dann schlägt der gesamte JavaScript-Frame-Busting-Code fehl.
Nach Überprüfung des gesamten Frame-Busing-Codes funktioniert nur diese Verteidigung in allen Fällen:
das ursprünglich von Gustav Rydstedt, Elie Bursztein, Dan Boneh und Collin Jackson (2010) vorgeschlagene
quelle
Nachdem ich eine Weile darüber nachgedacht habe, glaube ich, dass dies ihnen zeigen wird, wer der Boss ist ...
Wenn Sie
_top
als Zielparameter für verwenden,window.open()
wird es im selben Fenster gestartet.quelle
quelle
Ich werde mutig sein und meinen Hut in den Ring werfen (so alt er ist), um zu sehen, wie viele Downvotes ich sammeln kann.
Hier ist mein Versuch, der anscheinend überall dort funktioniert, wo ich ihn getestet habe (Chrome20, IE8 und FF14):
Ich habe diesen Code in die
<head>
<body>
Feld eingefügt und ihn am Ende des aufgerufen, um sicherzustellen, dass meine Seite gerendert wird, bevor mit dem Schadcode gestritten wird. Ich weiß nicht, ob dies der beste Ansatz ist, YMMV.Wie funktioniert es?
... Ich höre dich fragen - nun, die ehrliche Antwort ist, ich nicht wirklich . Es hat viel Zeit gekostet, um es überall dort zum Laufen zu bringen, wo ich es getestet habe, und der genaue Effekt, den es hat, variiert geringfügig, je nachdem, wo Sie es ausführen.
Hier ist das Denken dahinter:
Für mein
http://mysite.tld/page-that-takes-a-while-to-load
(das Ziel des XHR) habe ich ein PHP-Skript verwendet, das so aussieht:Was geschieht?
Können Sie die Wartezeit in Chrome und Firefox nicht vermeiden?
Scheinbar nicht. Zuerst habe ich die XHR auf eine URL verwiesen, die eine 404 zurückgeben würde - dies funktionierte in Firefox nicht. Dann versuchte ich den
sleep(5);
Ansatz, auf den ich schließlich für diese Antwort gestoßen war, und fing dann an, auf verschiedene Weise mit der Schlaflänge herumzuspielen. Ich konnte kein wirkliches Muster für das Verhalten finden, aber ich habe festgestellt, dass Firefox, wenn es zu kurz ist, speziell keinen Ball spielt (Chrome und IE scheinen sich ziemlich gut zu benehmen). Ich weiß nicht, was die Definition von "zu kurz" in Wirklichkeit ist, aber 5 Sekunden scheinen jedes Mal zu funktionieren.Wenn vorübergehende Javascript-Ninjas etwas besser erklären wollen, was los ist, warum dies (wahrscheinlich) falsch, unzuverlässig, der schlechteste Code ist, den sie jemals gesehen haben usw. Ich werde gerne zuhören.
quelle
Ab 2015 sollten Sie CSP2 verwenden
frame-ancestors
Richtlinie verwenden. Dies wird über einen HTTP-Antwortheader implementiert.z.B
Natürlich unterstützen noch nicht viele Browser CSP2, daher ist es ratsam, den alten
X-Frame-Options
Header einzuschließen:Ich würde trotzdem empfehlen, beides einzuschließen , da Ihre Website sonst weiterhin anfällig für Clickjacking- Angriffe in alten Browsern ist und Sie natürlich auch ohne böswillige Absicht unerwünschte Frames erhalten. Die meisten Browser werden heutzutage automatisch aktualisiert. Unternehmensbenutzer bleiben jedoch aus Gründen der Kompatibilität älterer Anwendungen in alten Versionen von Internet Explorer stecken.
quelle
Ok, wir wissen also, dass das in einem Rahmen war. Also gehen wir location.href zu einer anderen speziellen Seite mit dem Pfad als GET-Variable. Wir erklären dem Benutzer nun, was los ist, und stellen einen Link mit der Option target = "_ TOP" bereit. Es ist einfach und würde wahrscheinlich funktionieren (habe es nicht getestet), erfordert jedoch eine gewisse Benutzerinteraktion. Vielleicht könnten Sie den Benutzer auf die beleidigende Site hinweisen und sich schämen, wenn Sie irgendwo auf Ihre Site klicken. Nur eine Idee, aber es funktioniert nachts.
quelle
Alle vorgeschlagenen Lösungen erzwingen direkt eine Änderung der Position des oberen Fensters. Was ist, wenn ein Benutzer möchte, dass der Frame dort ist? Zum Beispiel der obere Rahmen in den Bildergebnissen von Suchmaschinen.
Ich habe einen Prototyp geschrieben, bei dem standardmäßig alle Eingaben (Links, Formulare und Eingabeelemente) deaktiviert sind und / oder bei Aktivierung nichts tun.
Wenn ein enthaltener Frame erkannt wird, bleiben die Eingaben deaktiviert und eine Warnmeldung wird oben auf der Seite angezeigt. Die Warnmeldung enthält einen Link, über den eine sichere Version der Seite in einem neuen Fenster geöffnet wird. Dies verhindert, dass die Seite für Clickjacking verwendet wird, während der Benutzer den Inhalt in anderen Situationen anzeigen kann.
Wird kein enthaltender Frame erkannt, werden die Eingänge aktiviert.
Hier ist der Code. Sie müssen die Standard-HTML-Attribute auf sichere Werte setzen und zusätzliche Attribute hinzufügen, die die tatsächlichen Werte enthalten. Es ist wahrscheinlich unvollständig und aus Sicherheitsgründen müssen zusätzliche Attribute (ich denke an Event-Handler) wahrscheinlich auf die gleiche Weise behandelt werden:
quelle
Nun, Sie können den Wert des Zählers ändern, aber das ist offensichtlich eine spröde Lösung. Sie können Ihre Inhalte über AJAX laden, nachdem Sie festgestellt haben, dass sich die Site nicht innerhalb eines Frames befindet - auch keine gute Lösung, aber es wird hoffentlich vermieden, das Ereignis "on beforeunload" auszulösen (nehme ich an).
Edit: Eine andere Idee. Wenn Sie feststellen, dass Sie sich in einem Frame befinden, bitten Sie den Benutzer, Javascript zu deaktivieren, bevor Sie auf einen Link klicken, der Sie zur gewünschten URL führt (indem Sie einen Querystring übergeben, der Ihre Seite darüber informiert, dass der Benutzer Javascript nach Aktivierung wieder aktivieren kann gibt es).
Bearbeiten 2: Gehen Sie nuklear - Wenn Sie feststellen, dass Sie sich in einem Frame befinden, löschen Sie einfach den Inhalt Ihres Dokumentenkörpers und drucken Sie eine böse Nachricht.
Bearbeiten 3: Können Sie das oberste Dokument auflisten und alle Funktionen auf null setzen (auch anonyme)?
quelle
<body>
Inneren eines<plaintext>
Tags auf "gesetzt"display: none
. Es ist ziemlich effektiv.Wenn Sie direkt nach dem Buster-Code eine Warnung hinzufügen, blockiert die Warnung den Javascript-Thread und lässt die Seite laden. Dies ist, was StackOverflow tut, und es springt aus meinen Iframes heraus, selbst wenn ich den Frame Busting Buster benutze. Es hat auch mit meiner einfachen Testseite funktioniert. Dies wurde nur in Firefox 3.5 und IE7 unter Windows getestet.
Code:
quelle
Ich denke du warst fast da. Hast du es versucht:
oder alternativ:
Hinweis: Ich habe dies nicht getestet.
quelle
Wie wäre es, wenn Sie den Buster auch wiederholt anrufen? Dies schafft eine Rennbedingung, aber man kann hoffen, dass der Buster die Nase vorn hat:
quelle
Wenn Sie sich die von
setInterval()
ihnen zurückgegebenen Werte ansehen, die normalerweise einstellig sind, können Sie normalerweise alle diese Interrupts mit einer einzigen Codezeile deaktivieren:quelle
Ich habe vielleicht gerade einen Weg gefunden, das Frame Buster Buster Javascript zu zerstören. Mit dem getElementsByName in meiner Javascript-Funktion habe ich eine Schleife zwischen dem Frame Buster und dem eigentlichen Frame Buster Buster-Skript gesetzt. Schau dir diesen Beitrag an. http://www.phcityonweb.com/frame-buster-buster-buster-2426
quelle
setInterval und setTimeout erstellen ein automatisch inkrementierendes Intervall. Jedes Mal, wenn setTimeout oder setInterval aufgerufen wird, erhöht sich diese Zahl um eins, sodass Sie beim Aufrufen von setTimeout den aktuellen höchsten Wert erhalten.
Da es fast unbekannt ist, dass 10000 setIntervals und setTimeouts gleichzeitig funktionieren und setTimeout "letztes Intervall oder Timeout erstellt + 1" zurückgibt und top.clearInterval weiterhin verfügbar ist, werden die Black-Hat-Angriffe auf Frame besiegt Websites, die oben beschrieben wurden.
quelle
Verwenden Sie htaccess, um High-Jacking-Frameset, Iframe und Inhalte wie Bilder zu vermeiden.
Dies zeigt eine Copyright-Seite anstelle der erwarteten.
quelle
<meta name="referrer" …/>
und b) auch beim Klicken auf Links festgelegt wird, sodass Sie auch Links zu Ihrer Seite nicht zulassen und brechen das Netz.