Frame Buster Buster… Buster-Code erforderlich

422

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.onbeforeunloadEreignishandler 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 onbeforeunloadEreignis über zu löschen, onbeforeunload = nullhatte 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?

Jeff Atwood
quelle
6
Ich bin nicht sicher , ob das Rahmen-buster-buster tatsächlich funktioniert ... wenn ich versuche , es zu testen (zu einem Handler Umleiten mir ein 204 zurückzukehren einzurichten), es hindert mich daran , die Navigation überall außerhalb der Seite - einschließlich Schreib Sachen in der Adressleiste! Ich muss die Browser-Registerkarte schließen und eine neue öffnen, um irgendwohin zu gelangen. Mit anderen Worten, ich bin mir nicht sicher, ob dies eine Lösung braucht, denn der Frame-Buster-Buster, der kaputt gehen will, ist ... von Anfang an kaputt. :) (Entweder das oder ich habe meinen Test vermasselt, was niemals passieren konnte ...);)
Matt Winckler
16
Matt, der oben angegebene Frame-Buster-Buster-Code funktioniert definitiv . Ein .. äh .. Freund .. von mir .. hat mir .. davon erzählt. Oder so. :)
Jeff Atwood
10
Jeff, testen Sie mit beiden Fenstern in derselben Domain? Es sieht so aus, als ob Sie es wären, denn wenn Sie es nicht wären, würden Sicherheitsbeschränkungen Sie daran hindern, 'onBeforeUnload' zu ändern
James
29
Nebenbei bemerkt: Wenn Sie Beispiele veröffentlichen, verwenden Sie bitte Domains wie example.orgin RFC 2606 angegeben. Ietf.org/rfc/rfc2606.txt
Christoph
3
In Bezug auf das allgemeine Thema der Gegen-Gegen-Gegenmaßnahmen: galactanet.com/comic/view.php?strip=209
Joey

Antworten:

149

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

Sie sehen diese Seite in einem nicht autorisierten Rahmenfenster - (Bla bla ... potenzielles Sicherheitsproblem)

Klicken Sie auf diesen Link, um dieses Problem zu beheben

Nicht das Beste, aber ich sehe keine Möglichkeit, wie sie sich daraus herausarbeiten können.

Hugoware
quelle
2
Ich habe das versucht und das funktioniert. Ein weiterer Punkt, den ich an dieser Lösung mag, ist, dass sie dem Benutzer ans Licht bringt, auf welcher Art von Website er sich befand, bevor er zu Ihren Inhalten ging. Beispielcode: if (parent.frames.length> 0) {top.location.replace (document.location); setTimeout (function () {if (parent.frames.length> 0) {document.location = " google.com ";}}, 10); }
Papst
Dies ist nicht nur ein guter Weg, um Missbrauch zu vermeiden, es ist auch sehr freundlich zu Websites, die Ihre Website möglicherweise umrahmen möchten, um einen Blick darauf zu werfen, obwohl sie die Verwendung nicht zulassen. Im Idealfall sollte ein Screenshot der Homepage der Site verwendet werden, mit einer Erklärung, warum er nicht in dem oben überlagerten Iframe verwendet werden kann.
Wheresrhys
33
So macht es Facebook.
Shamittomar
2
aber vielleicht könnte dies ausgenutzt werden, wenn die Busting-Site wiederum ein falsches Anti-Anti-Anti erzeugt ... (weiß nicht, wie viel Anti wir bis jetzt sind) lighbox div für sich selbst, das einen Phishing-Link oder was auch immer präsentiert ... tbc
yunzen
7
Eine andere Idee wäre, die Seite einfach komplett mit etwas wie zu document.write("");
löschen
211

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

EricLaw
quelle
6
Hervorragend, dies im Browser zu unterstützen .exe ist ohne Zweifel der richtige Weg. Wenn Sie "die meisten Browser" sagen, welche speziell? Ich kann keine guten Quellen für etwas anderes als IE8 finden.
Jeff Atwood
2
Hier ist eine Testseite: boostie.com/test/clickjack . Chrome 4.1.249.1042 unterstützt. Opera 10.50 unterstützt. Firefox 3.6.2 unterstützt noch NICHT. Safari 4.0.3 unterstützt.
EricLaw
1
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- Optionen-in-Firefox )
ssokolow
4
Am besten kombinieren Sie dies mit dem Javascript-Framebuster.
Jesse Weigert
1
Oder kombinieren Sie dies mit der Antwort vom Dezember '12 auf dieser Seite: stackoverflow.com/a/13708510/328397
goodguys_activate
34

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

<style>
 body { 
 display : none   
}
</style>
<script>
if(self == top) {
document.getElementsByTagName("body")[0].style.display = 'block';
}
else{
top.location = self.location;
}
</script>
Dungeon Hunter
quelle
3
Bingo! Ich bin mir nicht sicher, warum dies nicht mehr positiv bewertet wird, da es die beste Antwort ist (neben der Antwort auf die X-Frame-Optionen, aber es ist am besten, beide zu kombinieren)
Jesse Weigert
1
Diese oder meine Antwort sollte ausgewählt werden :)
Ich mag Ihre Idee, sowohl diese als auch die X-Frame-Optionen zu verwenden: Antwort verweigern.
Max West
Dies erfordert JS, was meiner Meinung nach eine ziemlich große Belastung darstellt.
Navin
1
+1 - Dies ist die beste Antwort, wenn X-FRAME-OPTIONEN nicht verwendet werden können. (Zum Beispiel, wenn Sie abhängig vom Überweiser bedingt zulassen oder ablehnen müssen.)
Jay Sullivan
29

Kam damit auf und es scheint zumindest in Firefox und dem Opera-Browser zu funktionieren.

if(top != self) {
 top.onbeforeunload = function() {};
 top.location.replace(self.location.href);
}
Jani Hartikainen
quelle
2
Die Lösung von Jani und Jeff (einmal bearbeitet) ist korrekt und funktioniert gleichwertig. Jani die Annahme geben, weil seine Lösung ohne Bearbeitung richtig funktionierte
Jeff Atwood
29
Dies funktioniert nur, wenn sich die beiden Fenster in derselben Domäne befinden. Ein seltenes Ereignis, wenn Sie aus einem Frame entkommen möchten.
James
Wenn es sich um verschachtelte Frames handelt, müssen Sie die Frame-Kette onbeforeunloaddurchlaufen und alle Handler entfernen , nicht nur den oben genannten!
Christoph
12
Wichtige Klarstellung: Dies hat bei mir funktioniert, da der iframe src = dynamisch festgelegt wurde und daher die domänenübergreifende Richtlinie NICHT in Kraft war. JP ist absolut richtig, in einem statischen src = das würde nicht funktionieren.
Jeff Atwood
5
ok jetzt kann sich jemand einen Frame Buster Buster Buster Buster einfallen lassen?
Epaga
23

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:

allow-forms: Allow form submissions.
allow-popups: Allow opening popup windows.
allow-pointer-lock: Allow access to pointer movement and pointer lock.
allow-same-origin: Allow access to DOM objects when the iframe loaded form same origin
allow-scripts: Allow executing scripts inside iframe
allow-top-navigation: Allow navigation to top level window

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:

<iframe src="URI" sandbox></iframe>

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:

<style id="antiClickjack">body{display:none !important;}</style>
<script type="text/javascript">
   if (self === top) {
       var antiClickjack = document.getElementById("antiClickjack");
       antiClickjack.parentNode.removeChild(antiClickjack);
   } else {
       top.location = self.location;
   }
</script>

das ursprünglich von Gustav Rydstedt, Elie Bursztein, Dan Boneh und Collin Jackson (2010) vorgeschlagene


quelle
19

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');
}

Wenn Sie _topals Zielparameter für verwenden, window.open()wird es im selben Fenster gestartet.

Josh Stodola
quelle
6
if (top != self) {
  top.location.replace(location);
  location.replace("about:blank"); // want me framed? no way!
}

quelle
6

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

(function() {
    if (top == self) {
        return;
    }

    setInterval(function() {
        top.location.replace(document.location);
        setTimeout(function() {
            var xhr = new XMLHttpRequest();
            xhr.open(
                'get',
                'http://mysite.tld/page-that-takes-a-while-to-load',
                false
            );
            xhr.send(null);
        }, 0);
    }, 1);
}());

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:

  • Stellen Sie eine Funktion so ein, dass sie im niedrigstmöglichen Intervall ausgeführt wird. Das Grundkonzept hinter jeder der realistischen Lösungen, die ich gesehen habe, besteht darin, den Scheduler mit mehr Ereignissen zu füllen als der Frame Buster-Buster.
  • Versuchen Sie bei jedem Auslösen der Funktion, die Position des oberen Frames zu ändern. Ziemlich offensichtliche Anforderung.
  • Planen Sie außerdem eine sofortige Ausführung einer Funktion ein, deren Ausführung lange dauert (wodurch verhindert wird, dass der Frame Buster-Buster den Standortwechsel stört). Ich habe mich für eine synchrone XMLHttpRequest entschieden, weil dies der einzige Mechanismus ist, an den ich denken kann, der keine Benutzerinteraktion erfordert (oder zumindest danach fragt) und die CPU-Zeit des Benutzers nicht verschlingt.

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:

<?php sleep(5);

Was geschieht?

  • Chrome und Firefox warten die 5 Sekunden, bis die XHR abgeschlossen ist, und leiten dann erfolgreich zur URL der gerahmten Seite um.
  • IE leitet so ziemlich sofort um

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.

DaveRandom
quelle
Scheint, Sie können alle Ihre besorgniserregenden Sätze entfernen
mplungjan
6

Ab 2015 sollten Sie CSP2 verwenden frame-ancestors Richtlinie verwenden. Dies wird über einen HTTP-Antwortheader implementiert.

z.B

Content-Security-Policy: frame-ancestors 'none'

Natürlich unterstützen noch nicht viele Browser CSP2, daher ist es ratsam, den alten X-Frame-OptionsHeader einzuschließen:

X-Frame-Options: DENY

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.

SilverlightFox
quelle
1
Alle gängigen Browser unterstützen jetzt CSP. Dies ist die richtige Antwort im Jahr 2019 und in absehbarer Zukunft.
Stephen R
5

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
5

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:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
  <head>
    <title></title>
    <script><!--
      function replaceAttributeValuesWithActualOnes( array, attributeName, actualValueAttributeName, additionalProcessor ) {
        for ( var elementIndex = 0; elementIndex < array.length; elementIndex += 1 ) {
          var element = array[ elementIndex ];
          var actualValue = element.getAttribute( actualValueAttributeName );
          if ( actualValue != null ) {
            element[ attributeName ] = actualValue;
          }

          if ( additionalProcessor != null ) {
            additionalProcessor( element );
          }
        }
      }

      function detectFraming() {
        if ( top != self ) {
          document.getElementById( "framingWarning" ).style.display = "block";
        } else {
          replaceAttributeValuesWithActualOnes( document.links, "href", "acme:href" );

          replaceAttributeValuesWithActualOnes( document.forms, "action", "acme:action", function ( form ) {
            replaceAttributeValuesWithActualOnes( form.elements, "disabled", "acme:disabled" );
          });
        }
      }
      // -->
    </script>
  </head>
  <body onload="detectFraming()">
    <div id="framingWarning" style="display: none; border-style: solid; border-width: 4px; border-color: #F00; padding: 6px; background-color: #FFF; color: #F00;">
      <div>
        <b>SECURITY WARNING</b>: Acme App is displayed inside another page.
        To make sure your data is safe this page has been disabled.<br>
        <a href="framing-detection.html" target="_blank" style="color: #090">Continue working safely in a new tab/window</a>
      </div>
    </div>
    <p>
      Content. <a href="#" acme:href="javascript:window.alert( 'Action performed' );">Do something</a>
    </p>
    <form name="acmeForm" action="#" acme:action="real-action.html">
      <p>Name: <input type="text" name="name" value="" disabled="disabled" acme:disabled=""></p>
      <p><input type="submit" name="save" value="Save" disabled="disabled" acme:disabled=""></p>
    </form>
  </body>
</html>
Johan Stuyts
quelle
Das Problem dabei ist, dass der Frame-Maker die Position: absolute verwenden könnte, um eine aktive Schaltfläche über Ihren inaktiven Schaltflächen zu platzieren, und der Benutzer sieht nur Ihre Webseite und denkt, er klickt auf IHRE Schaltflächen.
jmucchiello
Die Warnmeldung wird weiterhin angezeigt, aber es ist natürlich einfach, den Link zur sicheren Seite zu verdecken, wie Sie vorschlagen. Aber warum sollten Sie sich die Mühe machen, meine Seite so zu gestalten, dass die Leute auf eine vertraute Schaltfläche klicken, wenn Sie die Seite einfach kopieren und den gleichen Effekt erzielen können? Der obige Code verhindert hauptsächlich Clickjacking. Wenn Sie meine Seite unsichtbar über einer anderen Seite anzeigen, können Sie keine Aktionen auf meiner Website aufrufen.
Johan Stuyts
Wenn dies in einem IE8-Sperrzonenrahmen oder einem Chrome-Sandbox-Rahmen platziert ist, wird Javascript niemals ausgeführt. Ich frage mich, welche Änderungen in diesen Fällen erforderlich sind
goodguys_activate
4

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

RedFilter
quelle
Outlook (ehemals Hotmail) wird "nuklear", wenn es nicht aus einem Frame herauskommt - es setzt den gesamten Inhalt des <body>Inneren eines <plaintext>Tags auf "gesetzt" display: none. Es ist ziemlich effektiv.
uınbɐɥs
4

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:

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

Ich denke du warst fast da. Hast du es versucht:

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

oder alternativ:

window.parent.prevent_bust = 0;

Hinweis: Ich habe dies nicht getestet.

Jeff Fleischbällchen Yang
quelle
1
Ich habe Ihr Codebeispiel bearbeitet (der Test für Eltern scheint fehlzuschlagen), aber die bearbeitete Version scheint zu funktionieren!
Jeff Atwood
1
Cool. Es ist immer schwierig, mit ungetestetem Code zu antworten - ich mache es, um zumindest die Idee zu vermitteln - und den armen Fragesteller debuggen zu lassen. :)
Jeff Meatball Yang
12
Funktioniert nicht, wenn sich die Eltern in einer anderen Domäne befinden, was wahrscheinlich der Fall ist!
Josh Stodola
2

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:

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

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:

for (var j = 0 ; j < 256 ; ++j) clearInterval(j)
Robin Nixon
quelle
2

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

Phcityonweb
quelle
0

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.

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

cwallenpoole
quelle
0

Verwenden Sie htaccess, um High-Jacking-Frameset, Iframe und Inhalte wie Bilder zu vermeiden.

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://www\.yoursite\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule ^(.*)$ /copyrights.html [L]

Dies zeigt eine Copyright-Seite anstelle der erwarteten.

BF
quelle
Dies hängt vom Verweis ab, der a) nicht immer festgelegt ist (aufgrund von Browsereinstellungen oder -erweiterungen oder einfach, weil die verweisende Seite HTTPS ohne Verwendung verwendet <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.
Martin