Cómo evitar que la página de mi sitio se cargue a través del marco de un sitio de terceros de iFrame


81

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


Hola, John, no puedo decir que necesite una solución completa aquí, solo mover la dirección es suficiente, después de encontrar la respuesta a mi pregunta, siempre la publico como una respuesta, esta es la única forma en que puedo participar en la comunidad.
hasta

Nota: ¡Configurar la metaetiqueta es inútil! Por ejemplo, <meta http-equiv = "X-Frame-Options" content = "deny"> no tiene ningún efecto. ¡No lo uses! Solo si se configura a través del encabezado HTTP como en los ejemplos a continuación, X-Frame-Options funcionará. developer.mozilla.org/fr/docs/Web/HTTP/Headers/X-Frame-Options
Hosam Elzagh

Respuestas:


100

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 topy self, si no son idénticos, está en un marco.

Además, algunos navegadores modernos respetan el X-FRAME-OPTIONSencabezado, que puede tener dos valores:

  • DENY: evita que la página se represente si está contenida en un marco
  • SAMEORIGIN: igual que el anterior, a menos que la página pertenezca al mismo dominio que el titular del conjunto de marcos de nivel superior.

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:

  • IE8 y IE9
  • Opera 10.50
  • Safari 4
  • Chrome 4.1.249.1042
  • Firefox 3.6.9 (versiones anteriores con NoScript )

2
Desde que encontré aquí a través de una búsqueda en Google, agregaré que Firefox agregó X-FRAME-OPTIONS en agosto de 2010 con FF3.6.9: michael-coates.blogspot.com/2010/08/…
ThePants


43

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.


Este enfoque es particularmente útil si desea enviar un mensaje a la persona que está poniendo su contenido en un iframe o al usuario final de su sitio que está viendo su contenido en el iframe.
kevinmicke

29

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 .


1
Su respuesta no es lo suficientemente clara con el debido respeto. ¿Es este código de encabezado o PHP? Por ejemplo.
Gary Carlyle Cook

2
@GaryCarlyleCook Este es un encabezado HTTP que debería ser parte de la respuesta al navegador cuando se muestra una página. No es código PHP, aunque puede usar PHP para enviarlo; ver encabezado ()
rvighne

15

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.


1
sandboxatributo 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.
Frédéric

6

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.comestaba 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.comque 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.


3

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>

-1
<?php
    header("Content-Security-Policy: frame-ancestors 'none'");
?> 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.