Supongamos que tenemos una página web que no puede usar X-Frame-Options
, y la protección Clickjacking debe estar basada en JavaScript. En esta página, todas las acciones confidenciales y la visualización de información sensible se basan en JS, por lo que, por el bien de la pregunta, podemos asumir que JS está habilitado y en ejecución.
La técnica estándar actual consiste en comparar self
con top
y mostrar el contenido según el resultado. Ejemplo de OWASP :
<style id="antiClickjack">body{display:none !important;}</style>
Y luego elimine ese estilo por su ID inmediatamente después en el script:
<script type="text/javascript">
if (self === top) {
var antiClickjack = document.getElementById("antiClickjack");
antiClickjack.parentNode.removeChild(antiClickjack);
} else {
top.location = self.location;
}
</script>
Yo llamaría a este enfoque "no cerrado" porque el contenido permanece invisible hasta que JS considera que self
es igual a top
.
También hay una técnica de "apertura abierta" comúnmente utilizada en la que, si self
no es igual a top
, el contenido se oculta a través de CSS o al establecer document.body.innerHTML=''
.
Pregunta : ¿se puede omitir esta última protección de manera diferente que usar el atributo sandbox
en el iframe de los padres?
No lo creí hasta que leí esto blog comentar comparando las dos técnicas, y me pregunto si "no abrir" es lo suficientemente seguro:
"Podría usar varias cargas de JS en la página principal para hacer que el script de creación de cuadros en el iframe falle, evitando que oculte el contenido de la página. [...] Los que, en cambio, hacen aparecer el contenido de la página si no se está enmarcando fueron y siguen siendo perfectamente adecuados ".