Frame Buster Buster Buster … este nevoie de un cod buster (Programare, Javascript, Html, Iframe, Framebusting)

Jeff Atwood a intrebat.

Să zicem că nu doriți ca alte site-uri să vă „încadreze” site-ul dvs. în cadrul unui site <iframe>:

<iframe src="http://example.org"></iframe>

Așa că inserați JavaScript anti-frameing, frame busting în toate paginile dvs:

/* break us out of any containing iframes */
if (top != self) { top.location.replace(self.location.href); }

Excelent! Acum „spargeți” sau ieșiți automat din orice iframe care conține. Cu excepția unei mici probleme.

După cum se pare, codul tău de distrugere a cadrelor poate fi distrus, , așa cum se arată aici:

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

Acest cod face următoarele:

  • incrementează un contor de fiecare dată când browserul încearcă să navigheze în afara paginii curente, prin intermediul window.onbeforeunload gestionarul de evenimente
  • setează un cronometru care se declanșează la fiecare milisecundă prin intermediul setInterval(), și, dacă vede că numărătorul a crescut, schimbă locația curentă cu un server controlat de atacator.
  • serverul respectiv servește o pagină cu codul de stare HTTP 204, care nu determină browserul să navigheze nicăieri.

Întrebarea mea este – și aceasta este mai mult o enigmă JavaScript decât o problemă reală problemă reală — cum poți învinge „frame-busting buster”?

Am avut câteva idei, dar nimic nu a funcționat în testele mele:

  • încercarea de a șterge onbeforeunload eveniment prin onbeforeunload = null nu a avut niciun efect
  • adăugarea unui alert() a oprit procesul, permițând utilizatorului să știe că se întâmplă, dar nu a interferat în niciun fel cu codul; dacă se face clic pe OK, busting-ul continuă în mod normal.
  • Nu mă pot gândi la nicio modalitate de a șterge evenimentul setInterval() timer

Nu mă pricep prea bine la programarea JavaScript, așa că iată provocarea mea pentru tine: Hei, Buster, poți să spargi tu busterul de spargere a cadrelor?

Comentarii

  • Nu sunt sigur că spargatorul de cadre funcționează cu adevărat… când încerc să îl testez (redirecționând către un handler pe care l-am configurat să returneze un 204), mă împiedică să navighez oriunde în afara paginii, inclusiv să tastez ceva în bara de adrese! Trebuie să închid fila de browser și să deschid una nouă pentru a putea ajunge undeva. Deci, cu alte cuvinte, nu sunt sigur că asta are nevoie de o soluție, pentru că frame-busterul care vrea să fie spart este… spart de la bun început. 🙂 (Ori asta, ori am dat-o în bară cu testul meu, ceea ce nu s-ar putea întâmpla niciodată…) 😉 –  > Por Matt Winckler.
  • 16

  • Matt, codul frame-buster-buster-buster postat mai sus cu siguranță funcționează. Un… uh… prieten… mi-a spus… despre el. Sau ceva de genul ăsta. 🙂 –  > Por Jeff Atwood.
  • Jeff, testezi cu ambele ferestre pe același domeniu? Se pare că da, pentru că dacă nu, atunci restricțiile de securitate te-ar împiedica să modifici „onBeforeUnload” –  > Por James.
  • 29

  • În altă ordine de idei: Când postați exemple, vă rugăm să utilizați domenii precum example.org așa cum se specifică în RFC 2606 ietf.org/rfc/rfc2606.txt –  > Por Christoph.
  • În ceea ce privește tema generală a contra-contra-contramăsurilor: galactanet.com/comic/view.php?strip=209 –  > Por Joey.
20 răspunsuri
hugoware

Nu sunt sigur dacă acest lucru este viabil sau nu – dar dacă nu puteți sparge cadrul, de ce să nu afișați doar un avertisment. De exemplu, Dacă pagina dvs. nu este „pagina de sus”, creați o metodă setInterval care încearcă să spargă cadrul. Dacă după 3 sau 4 încercări, pagina dvs. tot nu este pagina de sus – creați un element div care acoperă întreaga pagină (caseta modală) cu un mesaj și un link de genul…

Vizualizați această pagină într-o fereastră de cadru neautorizată – (Blah blah blah… potențială problemă de securitate)

faceți clic pe acest link pentru a rezolva această problemă

Nu este cel mai bun, dar nu văd cum ar putea să facă un script pentru a scăpa de asta.

Comentarii

  • Am încercat asta și asta funcționează. O altă piesă care îmi place la această soluție este faptul că aduce la cunoștința utilizatorului pe ce fel de site a fost înainte de a ajunge la conținutul dumneavoastră. Exemplu de cod: if (parent.frames.length > 0) { top.location.replace(document.location); setTimeout(function() { if (parent.frames.length > 0) { document.location = „google.com„; } }, 10); } –  > Por papa.
  • Nu numai că aceasta este o modalitate bună de a evita abuzurile, dar este destul de prietenoasă cu site-urile care ar putea dori să facă iframe pe site-ul dvs. doar pentru a arunca o privire, deși nu pentru a permite utilizarea acestuia. În mod ideal, cred că ar trebui folosită o captură de ecran a paginii de pornire a site-ului, cu o explicație de ce nu poate fi folosit în iframe suprapusă deasupra. –  > Por wheresrhys.
  • 33

  • Iată cum procedează Facebook. –  > Por shamittomar.
  • dar poate că acest lucru ar putea fi exploatat dacă site-ul de busting va crea la rândul său un fals anti anti anti anti … (dunno cât de mult anti suntem până acum) lighbox div pentru el însuși prezentând un link de phishing sau ceva de genul … tbc –  > Por yunzen.
  • O altă idee ar fi de a șterge complet pagina cu ceva de genul document.write(""); (după ce ați stabilit că este vorba de o încadrare –  > Por gabeio.
EricLaw

Comentarii

  • excelent, suportul pentru acest lucru în browser .exe este fără îndoială calea de urmat. Când spui „majoritatea browserelor”, care anume? Nu pot găsi surse bune decât pentru IE8. –  > Por Jeff Atwood.
  • Iată o pagină de test: enhanceie.com/test/clickjack. Chrome 4.1.249.1042 suportă. Opera 10.50 suportă. Firefox 3.6.2 NU suportă încă. Safari 4.0.3 suportă. –  > Por EricLaw.
  • Firefox 3.6.9 îl va suporta în mod nativ ( hackademix.net/2010/08/31/… ) și orice instalare Firefox cu NoScript îl are de la începutul anului 2009 ( hackademix.net/2009/01/29/01/29/x-frame-options-in-firefox ) –  > Por ssokolow.
  • Cel mai bine este să combinați acest lucru cu javascript framebuster. –  > Por Jesse Weigert.
  • Sau combinați acest lucru cu răspunsul din decembrie ’12 de pe această pagină: stackoverflow.com/a/13708510/328397 –  > Por halfbit.
Vânătorul de temnițe

Am folosit următoarea abordare într-unul dintre site-urile noastre web de la 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>

Comentarii

  • Bingo! Nu sunt sigur de ce nu este mai mult upvoted, deoarece este cel mai bun răspuns (alături de răspunsul X-Frame-Options, dar cel mai bine este să le combinăm pe amândouă) –  > Por Jesse Weigert.
  • Acest răspuns sau al meu ar trebui să fie selectat 🙂 – user1646111
  • Îmi place ideea ta de a folosi atât acest răspuns, cât și răspunsul X-Frame-Options:deny. –  > Por Max West.
  • Acest lucru necesită JS, ceea ce este o povară destul de mare IMHO. –  > Por Navin.
  • +1 – Acesta este cel mai bun răspuns atunci când nu pot fi utilizate X-FRAME-OPTIONS. (De exemplu, atunci când trebuie să permiteți sau să refuzați condiționat în funcție de referent). –  > Por Jay Sullivan.
Jani Hartikainen

Am găsit această soluție și pare să funcționeze cel puțin în Firefox și în browserul Opera.

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

Comentarii

  • Atât soluția lui Jani, cât și cea a lui Jeff (după editare) sunt corecte și funcționează în mod echivalent; acordându-i lui Jani acceptul deoarece soluția sa a funcționat corect fără nicio editare –  > Por Jeff Atwood.
  • 29

  • Acest lucru va funcționa numai dacă cele două ferestre sunt din același domeniu; o situație rară atunci când doriți să evadați dintr-un cadru. –  > Por James.
  • Dacă sunt implicate cadre imbricate, va trebui să parcurgeți lanțul de cadre și să eliminați toate onbeforeunload nu doar cel de sus! –  > Por Christoph.
  • clarificare importantă: acest lucru a funcționat pentru mine deoarece iframe src= a fost setat dinamic și, prin urmare, politica cross-domain NU era în vigoare. J-P are perfectă dreptate, într-un src= static acest lucru nu ar funcționa. –  > Por Jeff Atwood.
  • ok acum poate cineva să vină cu un frame buster buster buster buster buster buster buster? –  > Por Epaga.
user1646111

Având în vedere standardul actual HTML5 care a introdus sandbox pentru iframe, toate codurile de spargere a cadrelor care au fost furnizate în această pagină pot fi dezactivate atunci când atacatorul folosește sandbox, deoarece restricționează iframe-ul de la următoarele:

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

Vă rugăm să consultați: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-iframe-element.html#attr-iframe-sandbox

Acum, considerați că atacatorul a folosit următorul cod pentru a găzdui site-ul dvs. în iframe:

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

Atunci, toate codurile JavaScript de distrugere a cadrelor vor eșua.

După verificarea tuturor codurilor de blocare a cadrelor, doar această apărare funcționează în toate cazurile:

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

care a fost propusă inițial de Gustav Rydstedt, Elie Bursztein, Dan Boneh și Collin Jackson (2010)

Josh Stodola

După ce m-am gândit puțin la asta, cred că asta le va arăta cine e șeful…

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

Folosind _top ca parametru țintă pentru window.open() îl va lansa în aceeași fereastră.

SilverlightFox

Începând cu 2015, ar trebui să utilizați CSP2’s frame-ancestors pentru acest lucru. Aceasta este implementată prin intermediul unui antet de răspuns HTTP.

De ex.

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

Desigur, nu multe browsere acceptă încă CSP2, așa că este înțelept să includeți vechea directivă X-Frame-Options antet:

X-Frame-Options: DENY

Aș sfătui să le includeți pe amândouă oricum, altfel site-ul dvs. ar continua să fie vulnerabil la Clickjacking atacurilor de tip Clickjacking în browserele vechi și, bineînțeles, ați obține o încadrare nedorită chiar și fără intenții rău intenționate. Majoritatea browserelor se actualizează automat în zilele noastre, însă există în continuare tendința ca utilizatorii corporativi să rămână blocați pe versiunile vechi ale Internet Explorer din motive de compatibilitate cu aplicațiile vechi.

Comentarii

  • Toate browserele importante acceptă acum CSP. Acesta este răspunsul corect în 2019 și în viitorul previzibil. –  > Por Stephen R.
Johan Stuyts

Toate soluțiile propuse forțează în mod direct o schimbare a locației ferestrei de sus. Ce se întâmplă dacă un utilizator dorește ca rama să fie acolo? De exemplu, cadrul de sus în rezultatele imaginilor din motoarele de căutare.

Am scris un prototip în care, în mod implicit, toate intrările (link-uri, formulare și elemente de intrare) sunt dezactivate și/sau nu fac nimic atunci când sunt activate.

Dacă este detectat un cadru care conține un cadru, intrările sunt lăsate dezactivate și un mesaj de avertizare este afișat în partea de sus a paginii. Mesajul de avertizare conține un link care va deschide o versiune sigură a paginii într-o fereastră nouă. Acest lucru previne ca pagina să fie folosită pentru clickjacking, permițând în același timp utilizatorului să vizualizeze conținutul în alte situații.

Dacă nu este detectat niciun cadru de conținut, intrările sunt activate.

Iată codul. Trebuie să setați atributele HTML standard la valori sigure și să adăugați atribute suplimentare care să conțină valorile reale. Probabil că este incomplet, iar pentru o siguranță deplină, atributele suplimentare (mă gândesc la gestionarii de evenimente) vor trebui probabil tratate în același mod:

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

Comentarii

  • Problema este că producătorul de cadre ar putea folosi position:absolute pentru a plasa butonul activ deasupra butoanelor inactive, iar utilizatorul va vedea pagina dvs. web și va crede că face clic pe butoanele Dvs. –  > Por jmucchiello.
  • Mesajul de avertizare ar fi în continuare afișat, dar, desigur, este ușor de acoperit link-ul către pagina sigură, așa cum sugerați. Dar de ce să vă chinuiți să îmi încadrați pagina pentru a-i face pe oameni să facă clic pe un buton cunoscut, dacă puteți pur și simplu să copiați pagina și să obțineți același efect? Codul de mai sus previne în principal deturnarea clicurilor. Dacă afișați pagina mea în mod invizibil deasupra altei pagini, nu este posibil să se invoce acțiuni pe site-ul meu. –  > Por Johan Stuyts.
  • Dacă acest lucru este plasat într-un cadru de zonă restricționată IE8 sau într-un cadru sandbox Chrome, Javascript nu va rula niciodată. Mă întreb ce modificări sunt necesare în aceste cazuri –  > Por halfbit.
Giorgio Maone
if (top != self) {
  top.location.replace(location);
  location.replace("about:blank"); // want me framed? no way!
}

DaveRandom

Voi fi curajos și îmi voi arunca pălăria în ring în acest caz (oricât de vechi ar fi), să văd câte downvotes pot aduna.

Iată încercarea mea, care pare să funcționeze peste tot unde am testat-o (Chrome20, IE8 și 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);
}());

Am plasat acest cod în <head> și l-am apelat de la sfârșitul secvenței <body> pentru a mă asigura că pagina mea este redată înainte de a începe să se certe cu codul malițios, nu știu dacă aceasta este cea mai bună abordare, YMMV.

Cum funcționează?

…vă aud întrebând – ei bine, răspunsul sincer este că nu știu cum funcționează. cu adevărat știu. A fost nevoie de o mulțime de fudulări pentru a face să funcționeze peste tot unde am testat, iar efectul exact pe care îl are variază ușor în funcție de locul în care îl executați.

Iată care este ideea din spatele acestui lucru:

  • Setați o funcție să ruleze la cel mai mic interval posibil. Conceptul de bază din spatele oricăreia dintre soluțiile realiste pe care le-am văzut este de a umple planificatorul cu mai multe evenimente decât cele pe care le are „frame buster-busterul”.
  • De fiecare dată când funcția se declanșează, încercați să schimbați locația cadrului de sus. Cerință destul de evidentă.
  • Programați, de asemenea, o funcție care să ruleze imediat și care va dura mult timp pentru a se finaliza (blocând astfel buster-busterul de cadre să interfereze cu schimbarea locației). Am ales un XMLHttpRequest sincron pentru că este singurul mecanism la care mă pot gândi care nu necesită (sau cel puțin nu cere) interacțiunea utilizatorului și nu roade timpul CPU al utilizatorului.

În cazul meu http://mysite.tld/page-that-takes-a-while-to-load (ținta XHR) am folosit un script PHP care arată astfel:

<?php sleep(5);

Ce se întâmplă?

  • Chrome și Firefox așteaptă cele 5 secunde cât timp XHR-ul se finalizează, apoi redirecționează cu succes către URL-ul paginii încadrate.
  • IE redirecționează destul de imediat

Nu se poate evita timpul de așteptare în Chrome și Firefox?

Se pare că nu. La început am îndreptat XHR către un URL care să returneze un 404 – acest lucru nu a funcționat în Firefox. Apoi am încercat cu sleep(5); abordarea la care am ajuns în cele din urmă pentru acest răspuns, apoi am început să mă joc cu lungimea de așteptare în diferite moduri. Nu am putut găsi un model real de comportament, dar am constatat că, dacă este prea scurtă, în mod specific Firefox nu va juca mingea (Chrome și IE par a fi destul de bine comportate). Nu știu care este definiția termenului „prea scurt” în termeni reali, dar 5 secunde pare să funcționeze de fiecare dată.


Dacă vreun ninja Javascript în trecere vrea să explice un pic mai bine ce se întâmplă, de ce este (probabil) greșit, nesigur, cel mai prost cod pe care l-a văzut vreodată etc., voi asculta cu plăcere.

Comentarii

  • Se pare că puteți elimina toate propozițiile îngrijorătoare –  > Por mplungjan.
Mike

Ok, deci știm că au fost într-un cadru. Deci, ne location.href la o altă pagină specială cu calea ca o variabilă GET. Acum îi explicăm utilizatorului ce se întâmplă și oferim un link cu opțiunea target=”_TOP”. Este simplu și probabil că ar funcționa (nu am testat-o), dar necesită o anumită interacțiune cu utilizatorul. Poate că ați putea indica utilizatorului site-ul incriminat și ați putea face o sală a rușinii a celor care fac clic pe site-ul dumneavoastră undeva… Este doar o idee, dar poate funcționa noaptea…

D’Arcy Rittich

Ei bine, puteți modifica valoarea contorului, dar aceasta este, evident, o soluție fragilă. Puteți încărca conținutul prin AJAX după ce ați stabilit că site-ul nu se află într-un cadru – de asemenea, nu este o soluție grozavă, dar sper că evită declanșarea evenimentului on beforeunload (presupun).

Editare: O altă idee. Dacă detectați că vă aflați într-un cadru, cereți utilizatorului să dezactiveze javascript, înainte de a face clic pe un link care vă duce la URL-ul dorit (trecând un sir de întrebări care permite paginii dvs. să îi spună utilizatorului că poate reactiva javascript odată ajuns acolo).

Ediția 2: Mergeți la nuclear – dacă detectați că vă aflați într-un cadru, ștergeți pur și simplu conținutul corpului documentului și imprimați un mesaj urât.

Editare 3: Poți să enumeri documentul de sus și să setezi toate funcțiile la null (chiar și cele anonime)?

Comentarii

  • Outlook (fostul Hotmail) „se dezlănțuie” dacă nu poate ieși dintr-un cadru – pune întregul conținut al documentului <body> în interiorul unui <plaintext> setată la display: none. Este destul de eficient. –  > Por uınbɐɥs.
Marius

Dacă adaugi o alertă imediat după codul buster, atunci alerta va bloca firul javascript și va lăsa pagina să se încarce. Asta face StackOverflow, și îmi sare din iframe, chiar și atunci când folosesc busterul de spargere a cadrelor. De asemenea, a funcționat și cu pagina mea simplă de test. Acest lucru a fost testat doar în Firefox 3.5 și IE7 pe Windows.

Cod:

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

Jeff Meatball Yang

Cred că erai aproape de final. Ați încercat:

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

sau, alternativ:

window.parent.prevent_bust = 0;

Notă: Nu am testat acest lucru.

Comentarii

  • Am editat exemplul dvs. de cod (testul pentru părinte pare să eșueze), dar versiunea editată pare să funcționeze! –  > Por Jeff Atwood.
  • Frumos. Întotdeauna este dificil să răspunzi cu cod netestat – o fac pentru a transmite măcar ideea – și pentru a-l lăsa pe bietul solicitant să depaneze. 🙂 –  > Por Jeff Meatball Yang.
  • Nu va funcționa dacă părintele este pe un domeniu diferit, ceea ce este probabil cazul! –  > Por Josh Stodola.
Robin Nixon

Dacă vă uitați la valorile returnate de setInterval() acestea sunt de obicei de o singură cifră, astfel încât, de obicei, puteți dezactiva toate aceste întreruperi cu o singură linie de cod:

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

Christoph

Ce ziceți de apelarea repetată a busterului, de asemenea, în mod repetat? Acest lucru va crea o condiție de cursă, dar se poate spera că busterul iese învingător:

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

Phcityonweb

S-ar putea să fi găsit o modalitate de a sparge javascript busterul busterului de cadre. Folosind getElementsByName în funcția mea javascript, am setat o buclă între frame buster și scriptul real al frame buster buster buster.check this post out. http://www.phcityonweb.com/frame-buster-buster-buster-2426

cwallenpoole

setInterval și setTimeout creează un interval care se incrementează automat. De fiecare dată când setTimeout sau setInterval este apelat, acest număr crește cu unu, astfel încât, dacă apelați setTimeout, veți obține valoarea curentă, cea mai mare.

   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";
   }

Deoarece este aproape imposibil să existe 10000 de setIntervals și setTimeouts simultane care să funcționeze și deoarece setTimeout returnează „ultimul interval sau timeout creat + 1” și deoarece top.clearInterval este încă accesibil, acest lucru va învinge atacurile de tip black-hat pentru încadrarea site-urilor web, descrise mai sus.

B.F.

Folosiți htaccess pentru a evita deturnarea la nivel înalt a frameset-ului, iframe-ului și a oricărui conținut precum imaginile.

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

Acest lucru va afișa o pagină cu drepturi de autor în loc de cea așteptată.

Comentarii

  • Acest lucru se bazează pe referrer-ul care a) nu este întotdeauna setat (din cauza setărilor browserului sau a extensiilor sau pur și simplu pentru că pagina de trimitere folosește HTTPS fără a utiliza <meta name="referrer" …/> și b) se setează și atunci când se dă clic pe linkuri, astfel încât, de asemenea, refuzați linkurile către pagina dvs. și rupeți web-ul. –  > Por Martin.
TheLinguist

Ați putea îmbunătăți întreaga idee prin utilizarea postMessage() metoda pentru a permite unor domenii să acceseze și să afișeze conținutul dvs. în timp ce le blocați pe toate celelalte. În primul rând, containerul-părinte trebuie să se prezinte prin postarea unui mesaj la contentWindow al domeniului iframe care încearcă să vă afișeze pagina. Iar pagina dvs. trebuie să fie pregătită să accepte mesaje,

window.addEventListener("message", receiveMessage, false);

function receiveMessage(event) {
  // Use event.origin here like
  if(event.origin == "https://perhapsyoucantrustthisdomain.com"){
  // code here to block/unblock access ... a method like the one in user1646111's post can be good.
  }
  else{
  // code here to block/unblock access ... a method like the one in user1646111's post can be good.
  }
}

În cele din urmă, nu uitați să înfășurați lucrurile în interiorul unor funcții care vor aștepta ca load evenimente.