¿Cómo puedo saber que mi página está incrustada como un marco en otro sitio durante la carga de la página? Supongo que el encabezado de solicitud de referencia no puede ayudarme aquí. Gracias.
¿Cómo puedo saber que mi página está incrustada como un marco en otro sitio durante la carga de la página? Supongo que el encabezado de solicitud de referencia no puede ayudarme aquí. Gracias.
Respuestas:
No puede verificarlo desde el lado del servidor, pero puede usar javascript para detectarlo después de que se haya cargado la página. Compare top
y self
, si no son idénticos, está en un marco.
Además, algunos navegadores modernos respetan el X-FRAME-OPTIONS
encabezado, que puede tener dos valores:
Los usuarios incluyen Picasa de Google, que no se puede incrustar en un marco.
Navegadores que admitan el encabezado, con la versión mínima:
Stackoverflow incluye algo de JS para probarlo ( master.js
). Esta es la parte relevante:
if(top!=self){
top.location.replace(document.location);
alert("For security reasons, framing is not allowed; click OK to remove the frames.")
}
Pero tenga en cuenta que JS se puede desactivar.
Para los navegadores modernos , puede utilizar CSP (Política de seguridad de contenido), que es un estándar. El siguiente encabezado evitará que el documento se cargue en un marco en cualquier lugar:
Content-Security-Policy: frame-ancestors 'none'
(IE 11 necesita el X-
prefijo, sin embargo). También puede cambiar 'none'
al origen en el que se permite el encuadre, como su propio sitio.
Para cubrir los navegadores más antiguos, esto se usa mejor junto con la respuesta de @ Maerlyn .
puede evitar cargar su página en un iframe con javascript
<script type="text/javascript">
if ( window.self !== window.top ) {
window.top.location.href=window.location.href;
}
</script>
este código cambia la dirección del contenedor del iframe de su página a la dirección de su página y obliga al contenedor a mostrar su página.
sandbox
atributo en iframe permite prohibir este tipo de marcos que se escapan de los ataques. Por lo tanto, esta forma no es una forma segura de evitar el encuadre, en caso de que su preocupación sean problemas de seguridad.
O puede bloquear un dominio específico si no le importa su contenido en algunas ubicaciones pero no lo quiere en un sitio determinado. Por ejemplo, si offendingdomain.com
estaba incrustando su contenido, podría hacer esto:
<script type="text/javascript">
if(document.referrer.indexOf("offendingdomain.com") != -1) {
window.location = "http://www.youtube.com/watch_popup?v=oHg5SJYRHA0";
}
</script>
Esto verificaría la ubicación del documento principal y vería si es el offendingdomain.com
que está incrustando su contenido. Este script luego enviará ese iframe a cierto video famoso de YouTube como castigo. En efecto, ellos mismos simplemente Rick-Rolled.
Use javascript para verificar si se cargó en iframe colocando el siguiente script al final de su archivo php y redirigir a una página que muestra una advertencia o aviso de que su página no debe cargarse usando iframe.
<script type="text/javascript">
if(top.location != window.location) {
window.location = '/error_iframe.php';
}
</script>
<?php
header("Content-Security-Policy: frame-ancestors 'none'");
?>