Supponiamo di avere una pagina web che non può utilizzare X-Frame-Options
e la protezione di Clickjacking deve essere basata su JavaScript. In questa pagina, tutte le azioni sensibili e la visualizzazione delle informazioni sensibili sono basate su JS, quindi per il gusto della domanda possiamo supporre che JS sia abilitato e in esecuzione.
L'attuale tecnica standard prevede il confronto di self
con top
e di visualizzare il contenuto in base al risultato. Esempio da OWASP :
<style id="antiClickjack">body{display:none !important;}</style>
E poi cancella quello stile con il suo ID subito dopo nello script:
<script type="text/javascript">
if (self === top) {
var antiClickjack = document.getElementById("antiClickjack");
antiClickjack.parentNode.removeChild(antiClickjack);
} else {
top.location = self.location;
}
</script>
Chiamerei questo approccio "fail closed" perché il contenuto rimane invisibile fino a quando JS considera self
uguale a top
.
Esiste anche una tecnica "fail open" comunemente usata in cui, se self
non è uguale a top
, il contenuto è nascosto tramite CSS o impostando document.body.innerHTML=''
.
Domanda : la seconda protezione può essere ignorata in modi altro rispetto all'utilizzo dell'attributo sandbox
sull'iframe del genitore?
Non ci credevo finché non ho letto questo blog commentare confrontando le due tecniche e mi sono chiesto se "fail open" sia abbastanza sicuro:
"You could use various JS payloads on the parent page to make the framebusting script in the iframe fail, preventing it from hiding the content of the page. [...] The ones that instead make the content of the page appear if it is not being framed were and are still perfectly fine."