para open iframes hacer ejemplo con codigo basico javascript html iframe cross-browser

javascript - open - Manera infalible de detectar si esta página está DENTRO de un iframe de dominios cruzados



iframes properties (8)

Con sus restricciones actuales, no hay forma de lograr esto usando la API DOM. Cualquier evaluación con una ventana que pertenezca a otro dominio arrojará un error.

Sin embargo, un "truco" sería enviar un XHR desde la ventana de su hijo para cargar una página conocida en su dominio. Si este XHR se completa con éxito, entonces sabe que ambas ventanas son del mismo dominio.

Sin embargo, esto registrará un mensaje de error en la consola.

Una respuesta a "Una manera infalible de detectar si iframe es un dominio cruzado " describe un método para probar si un iframe en una página apunta a una página del mismo dominio o dominio cruzado, trabajando alrededor de las interpretaciones de diferentes navegadores de la política de dominio cruzado evitando mensajes de error que pudieran interrumpir a un usuario o detener javascript.

Estoy buscando hacer el equivalente a esto, pero desde la página secundaria dentro del iframe se comprueba si está dentro de un iframe de dominio cruzado o no.

Es posible acceder a la información (del mismo dominio) sobre el padre con el parent principal, por ejemplo, parent.document.location , pero ¿existe una manera confiable de hacer este navegador cruzado sin chocar con errores cuando detecta que el padre es un dominio cruzado?

Para realizar pruebas prácticas, aquí hay un jsbin dentro de un jsfiddle que se bloquea en un error al intentar probar si se puede acceder a parent.location.host . ¿Existe una manera confiable de obtener algo utilizable como false que nos diga que este es un padre de dominio cruzado, en lugar de un error?

¿Hay una variante try...catch que será un navegador cruzado robusto? ¿O quizás algún truco inteligente usando un valor de retorno de parent.postMessage() ? (aunque la página principal no puede ser editada)

Caso de uso: imagine contenido integrable que se incrustará en las páginas de su propio sitio y por parte de terceros. Si la página está en un iframe del mismo dominio, ocultamos la marca y los enlaces al sitio original porque el usuario ya está aquí. Si acceden a la página desde un iframe de terceros o la cargan directamente, mostramos la marca y los créditos para que puedan ver la fuente del contenido.

Para aclarar, conozco la política del mismo dominio y no me importa lo que es el dominio de navegador cruzado, solo estoy buscando escribir una condición simple pero confiable if como if( crossDomainParent() ){ /* do something */}


Intenté usar el referente para determinar el dominio cruzado, pero descubrí que no era confiable en muchos sitios. Quizás a alguien le resulte útil.

function IsCrossDomainFrame() { if( parent === window ) return false; //not a frame var parentLocation = new URL(document.referer);//the referer of an iframe is the parent return (parentLocation.protocol !== location.protocol || parentLocation.hostname !== location.hostname || parentLocation.port !== location.port); }

Protocolo, nombre de host y puerto determinan el dominio cruzado.


Para iframes anidados: una forma recursiva de saber si iframe (donde se ejecuta este código) es de dominio cruzado o no:

function crosDomIfrm(win, data) { data = (typeof data === ''undefined'')?{ref:win.document.location,isCD:false}:data; try { if( win.document.referrer != '''' ){ data.isCD = parseURL(data.ref) != parseURL(win.document.referrer); } } catch(e){} if ( (win.self !== win.parent) && !data.isCD ) { //I''m in iframe data = crosDomIfrm( win.parent, data ); } return {ref:data.ref,isCD:data.isCD}; }, function parseURL(url) { var a=document.createElement(''a''); a.href=url; return a.hostname; }


Primero verifica si eres IFramed.

window.self !== window.top

Si está IFramed, entonces su referencia es la url de marco principal.

document.referrer

Desde esta URL, debería poder detectar si desea bifurcar su código.


Prueba esto (en iframe)

<script type="text/javascript"> var detectOrigin = (window.location.ancestorOrigins === undefined ? /example.com/.test(document.domain) /* firefox */ : /example.com/.test(window.location.ancestorOrigins[0])); /* webkit */ if (detectOrigin === true) {console.log(detectOrigin)}; /* `true` example.com origin */ if (detectOrigin === false) {console.log(detectOrigin)}; /* `false` !example.com origin */ </script>


Si veo tu caso de uso:

Lo verificaría en el lado del servidor (quién llamó a su sitio), usando $_SERVER[''REMOTE_ADDR''] , y si es su IP, puede ocultar la marca y los enlaces de vuelta.

Si el caso de uso está a punto de evitar el enmarcado de su sitio, puede usar X-Frame-Options: deny .

Otra conjetura: los elementos dentro de un documento tienen una propiedad ownerDocument , tal vez eso puede ayudar a detectar lo que desea.


Una verdadera solución entre navegadores para la posteridad:

function isCrossOriginFrame() { try { return (!window.top.location.hostname); } catch (e) { return true; } } console.log(isCrossOriginFrame());

Probado en una franja decente de navegadores de escritorio y móviles.

https://jsfiddle.net/arzd4btc/3/


use el encabezado x-frame para evitar cargar su sitio en frame / iframe. Hay varias opciones leídas aquí.