Supponiamo che non desideri che altri siti "modellino" il tuo sito in un <iframe>
:
<iframe src="http://example.org"></iframe>
Quindi inserisci JavaScript anti-framing e anti-frame in tutte le tue pagine:
/* break us out of any containing iframes */
if (top != self) { top.location.replace(self.location.href); }
Eccellente! Ora "rompi" o rompi automaticamente qualsiasi iframe contenente. Tranne un piccolo problema.
A quanto pare, il tuo codice di frame-busting può essere eliminato , come mostrato qui :
<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>
Questo codice esegue le seguenti operazioni:
- incrementa un contatore ogni volta che il browser tenta di spostarsi dalla pagina corrente, tramite il
window.onbeforeunload
gestore eventi - imposta un timer che si attiva ogni millisecondo
setInterval()
e, se vede incrementare il contatore, cambia la posizione corrente in un server di controllo dell'attaccante - quel server serve una pagina con codice di stato HTTP 204 , che non fa navigare il browser da nessuna parte
La mia domanda è - e si tratta più di un puzzle JavaScript che di un problema reale - come si può sconfiggere il busto del frame-busting?
Ho avuto alcuni pensieri, ma nulla ha funzionato nei miei test:
- il tentativo di cancellare l'
onbeforeunload
evento tramiteonbeforeunload = null
non ha avuto alcun effetto - l'aggiunta di un
alert()
processo interrotto informa l'utente che stava accadendo, ma non ha interferito in alcun modo con il codice; facendo clic su OK, il busting continua normalmente - Non riesco a pensare ad alcun modo per azzerare il
setInterval()
timer
Non sono un programmatore JavaScript, quindi ecco la mia sfida per te: hey buster, riesci a sballare il frame-busting buster?
example.org
specificato in RFC 2606 ietf.org/rfc/rfc2606.txt