javascript añadir - ¿Cómo identificar si una página web se está cargando dentro de un iframe o directamente en la ventana del navegador?




otra responsive (13)

Estoy escribiendo una aplicación de facebook basada en iframe. Ahora quiero usar la misma página html para representar el sitio web normal y la página de lienzo dentro de facebook. Quiero saber si puedo determinar si la página se ha cargado dentro del iframe o directamente en el navegador.


Answers

Es un código antiguo que he usado varias veces:

if (parent.location.href == self.location.href) {
    window.location.href = 'https://www.facebook.com/pagename?v=app_1357902468';
}

Dado que está preguntando en el contexto de una aplicación de Facebook, es posible que desee considerar la detección de esto en el servidor cuando se realiza la solicitud inicial. Facebook pasará un montón de datos de la cadena de consulta, incluida la clave fb_sig_user si se llama desde un iframe.

Como es probable que necesite verificar y usar estos datos de todas formas en su aplicación, úselo para determinar el contexto apropiado para renderizar.


Esto terminó siendo la solución más simple para mí.

    <p id="demofsdfsdfs"></p>

<script>

if(window.self !== window.top) {

//run this code if in an iframe
document.getElementById("demofsdfsdfs").innerHTML = "in frame";

}else{

//run code if not in an iframe
document.getElementById("demofsdfsdfs").innerHTML = "no frame";
}

</script>

En realidad, solía marcar window.parent y funcionó para mí, pero últimamente window es un objeto cíclico y siempre tiene una clave principal, iframe o no iframe.

Como los comentarios sugieren una comparación difícil con windows.parent funciona. No estoy seguro de si esto funcionará si iframe es exactamente la misma página web que el principal.

window === window.parent;

Escribe este javascript en cada página

if (self == top)
  { window.location = "Home.aspx"; }

Luego se redirige automáticamente a la página de inicio.


Si desea saber si el usuario está accediendo a su aplicación desde la pestaña de la página de Facebook o en el lienzo, consulte la Solicitud firmada. Si no lo consigues, probablemente el usuario no esté accediendo desde facebook. Para asegurarse de confirmar la estructura de los campos signed_request y el contenido de los campos.

Con el php-sdk puede obtener la solicitud firmada de esta manera:

$signed_request = $facebook->getSignedRequest();

Puedes leer más sobre Solicitud Firmada aquí:

https://developers.facebook.com/docs/reference/php/facebook-getSignedRequest/

y aquí:

https://developers.facebook.com/docs/reference/login/signed-request/


Los navegadores pueden bloquear el acceso a window.top debido a la misma política de origen . Errores de IE también tienen lugar. Aquí está el código de trabajo:

function inIframe () {
    try {
        return window.self !== window.top;
    } catch (e) {
        return true;
    }
}

top y self son ambos objetos de window (junto con el elemento parent ), por lo que está viendo si su ventana es la ventana superior.


Use esta función de javascript como un ejemplo de cómo lograr esto.

function isNoIframeOrIframeInMyHost() {
// Validation: it must be loaded as the top page, or if it is loaded in an iframe 
// then it must be embedded in my own domain.
// Info: IF top.location.href is not accessible THEN it is embedded in an iframe 
// and the domains are different.
var myresult = true;
try {
    var tophref = top.location.href;
    var tophostname = top.location.hostname.toString();
    var myhref = location.href;
    if (tophref === myhref) {
        myresult = true;
    } else if (tophostname !== "www.yourdomain.com") {
        myresult = false;
    }
} catch (error) { 
  // error is a permission error that top.location.href is not accessible 
  // (which means parent domain <> iframe domain)!
    myresult = false;
}
return myresult;
}

if (window.frames.length != parent.frames.length) { page loaded in iframe }

Pero solo si el número de iframes difiere en su página y en la página que lo está cargando en iframe. No haga iframe en su página para tener una garantía del 100% del resultado de este código


RoBorg tiene razón, pero quería añadir una nota al margen.

En IE7 / IE8, cuando Microsoft agregó pestañas a su navegador, rompieron una cosa que causará estragos en su JS si no tiene cuidado.

Imagina este diseño de página:

MainPage.html
  IframedPage1.html   (named "foo")
  IframedPage2.html   (named "bar")
    IframedPage3.html (named "baz")

Ahora, en el cuadro "baz", haces clic en un enlace (sin destino, se carga en el cuadro "baz") funciona bien.

Si la página que se carga, llamémosla special.html, usa JS para verificar si "tiene" un marco primario llamado "barra", devolverá verdadero (esperado).

Ahora digamos que la página special.html cuando se carga, comprueba el marco principal (busca la existencia y su nombre, y si es "barra" se vuelve a cargar en el marco de la barra, por ejemplo,

if(window.parent && window.parent.name == 'bar'){
  window.parent.location = self.location;
}

Hasta ahora tan bueno. Ahora viene el error.

Digamos que en lugar de hacer clic en el enlace original como de costumbre, y al cargar la página special.html en el marco "baz", hizo clic con el botón central o eligió abrirlo en una nueva pestaña.

Cuando esa nueva pestaña se cargue (¡ sin marcos principales! ) ¡ IE entrará en un bucle sin fin de carga de páginas! porque IE "copia sobre" la estructura del cuadro en JavaScript, de modo que la nueva pestaña TIENE un padre, y ese padre TIENE el nombre "barra".

La buena noticia es que revisando:

if(self == top){
  //this returns true!
}

en esa nueva pestaña devuelve verdadero, y así puedes probar esta condición impar.


La respuesta aceptada no me funcionó dentro del script de contenido de una extensión de Firefox 6.0 (Addon-SDK 1.0): Firefox ejecuta el script de contenido en cada una: la ventana de nivel superior y en todos los iframes.

Dentro del script de contenido obtengo los siguientes resultados:

 (window !== window.top) : false 
 (window.self !== window.top) : true

Lo extraño de esta salida es que siempre es lo mismo, independientemente de si el código se ejecuta dentro de un iframe o la ventana de nivel superior.

Por otro lado, Google Chrome parece ejecutar mi script de contenido solo una vez dentro de la ventana de nivel superior, por lo que lo anterior no funcionaría en absoluto.

Lo que finalmente me funcionó en un script de contenido en ambos navegadores es esto:

 console.log(window.frames.length + ':' + parent.frames.length);

Sin iframes, esto imprime 0:0 , en una ventana de nivel superior que contiene un marco, imprime 1:1 , y en el único iframe de un documento imprime 0:1 .

Esto permite que mi extensión determine en ambos navegadores si hay algunos iframes presentes, y adicionalmente en Firefox si se ejecuta dentro de uno de los iframes.


El mejor script para romper el marco del navegador heredado

Las otras soluciones no funcionaron para mí. Éste funciona en todos los navegadores:

Una forma de defenderse contra el clickjacking es incluir un script "que rompa el marco" en cada página que no deba ser enmarcado. La siguiente metodología evitará que una página web se enmarque incluso en navegadores heredados, que no son compatibles con X-Frame-Options-Header.

En el documento elemento HEAD, agregue lo siguiente:

<style id="antiClickjack">body{display:none !important;}</style>

Primero aplique una identificación al propio elemento de estilo:

<script type="text/javascript">
   if (self === top) {
       var antiClickjack = document.getElementById("antiClickjack");
       antiClickjack.parentNode.removeChild(antiClickjack);
   } else {
       top.location = self.location;
   }
</script>

De esta manera, todo puede estar en el documento HEAD y solo necesita un método / taglib en su API.

Referencia: https://www.codemagi.com/blog/post/194


Si agrega una alerta justo después del código del destructor, la alerta detendrá el hilo de javascript y permitirá que la página se cargue. Esto es lo que hace , y se quita de mis iframes, incluso cuando uso el destructor de marcos. También funcionó con mi página de prueba simple. Esto solo se ha probado en Firefox 3.5 e IE7 en Windows.

Código:

<script type="text/javascript">
if (top != self){
  top.location.replace(self.location.href);
  alert("for security reasons bla bla bla");
}
</script>




javascript facebook iframe