Intento de JavaScript inseguro para acceder al marco con URL

112

Recibo el siguiente error cuando intento establecer un valor hash en la URL principal de iframe que contiene otra URL de dominio:

JavaScript no seguro intenta acceder al marco con la URL "URL1" desde el marco con la URL "URL2". Deben coincidir los dominios, protocolos y puertos.

¿Como puedo solucionar este problema?

Atul
fuente
3
Por favor, añadir más detalles, fragmentos de código, mensaje de error, el marco se utiliza .. Más de verbosidad, más detalles ..
fifigyuri
5
¿Qué pasa cuando implementas g + 1, me gusta en facebook o complementos sociales de shre y twitter que se cargan en iframes y arrojan el mismo error?
La pregunta es POR QUÉ los scripts de Facebook y Google están INTENTANDO acceder a los elementos de mi sitio web.
sergio

Respuestas:

124

Desde un documento secundario de diferente origen, no se le permite el acceso a la location.hashpropiedad de la ventana superior , pero se le permite establecer la locationpropiedad en sí.

Esto significa que dado que la ubicación de las ventanas superiores es http://example.com/page/, en lugar de hacer

parent.location.hash = "#foobar";

necesita saber la ubicación de los padres y hacer

parent.location = "http://example.com/page/#foobar";

Dado que no se navega por el recurso, esto funcionará como se esperaba, solo cambiando la parte hash de la URL.

Si está usando esto para la comunicación entre dominios, le recomendaría usar easyXDM en su lugar.

Sean Kinsey
fuente
13
Nadie ha marcado esto como la respuesta y, sin embargo, tiene 60 votos a favor. Debería haber una insignia para esto.
zachzurn
35
¿Cómo se llamaría la placa? "Respondido a una persona perezosa"
nzifnab
1
Hola @atul, sé amable y marca esta respuesta como la mejor. Sea respetuoso con las convenciones que nos permiten a todos beneficiarnos del conocimiento de los demás ...
Clint Eastwood
13

Crossframe-Scripting no es posible cuando los dos marcos tienen dominios diferentes -> Seguridad.

Vea esto: http://javascript.about.com/od/reference/a/frame3.htm

Ahora, para responder a su pregunta: no hay solución o solución alternativa, simplemente debe verificar el diseño de su sitio web por qué debe haber dos marcos de diferentes dominios que cambian la URL del otro.

EvilMM
fuente
82
Este es un requisito frecuente cuando se inserta una aplicación de terceros en su sitio web, especialmente cuando los servicios web y similares no son una opción.
Jacques
9

Recibí el mismo mensaje de error cuando intenté cambiar el dominio para iframe.src.

Para mí, la respuesta fue cambiar el iframe.src a una URL en el MISMO dominio, pero que en realidad era una página de redireccionamiento html al dominio deseado. El otro dominio luego apareció en mi iframe sin ningún error.

Trabajado como un encanto. :)

Tommy
fuente
¿Podrías explicar más exactamente lo que hiciste aquí?
Devin G Rhode
Sería realmente útil si pudiera explicarlo brevemente.
Madhusudhan
2
No funciona en la última versión de Chrome: no verifica el parámetro src, pero se carga la URL real. Entonces, el truco de redirección desafortunadamente no ayuda de ninguna manera :-(
lucaferrario
3
Creo que Tommy se está refiriendo a un proxy del lado del servidor. Consulte, por ejemplo, benalman.com/projects/php-simple-proxy o developer.yahoo.com/javascript/howto-proxy.html o google.com/… o la solución de René de Kat en stackoverflow.com/a/11224975/27938
Oskar Austegard
Está muy bien. Pero solo ilustra lo trivial que es, en general, evitar esto. Bien, supongamos que soy un hacker malintencionado y quiero ejecutar ataques de secuencias de comandos entre dominios. Lo más probable es que conozca estas herramientas y las utilice. En cuanto a las correcciones de seguridad del navegador, esto se retrasa fácilmente como IE, ya que no le permite ejecutar Javascript localmente sin una advertencia. No resuelve ningún problema. Crea un montón de nuevos.
Yitzhak
6

Una solución podría ser utilizar un archivo local que recupere el contenido remoto.

remoteInclude.php

<?php
$url = $_GET['url'];
$contents = file_get_contents($url);
echo $contents;

El HTML

<iframe frameborder="1" id="frametest" src="/remoteInclude.php?url=REMOTE_URL_HERE"></iframe>
<script>
    $("#frametest").load(function (){       
    var contents =$("#frametest").contents();
});


fuente
1
Esto abre la puerta a vulnerabilidades de secuencias de comandos entre sitios. Un ejemplo de un posible ataque: 1. Creo una página en myevilserver.com que se parece a su sitio, incluido un formulario de inicio de sesión que se envía a myevilserver.com. 2. Envío un boletín falso a sus usuarios con un enlace a https: // yoursite.com/remoteInclude.php?url=myevilserver.com 3. Ven un formulario de inicio de sesión en su sitio que capturo en mi servidor.
EricP
2
Una posible solución es hacer que remoteInclude.php verifique todas las URL con una lista de dominios aprobados previamente.
EricP
Esto no resuelve los problemas de vulnerabilidad de secuencias de comandos entre sitios. No hay absolutamente nada que pueda hacer con Javascript en un sitio web externo que no pueda hacer desde el lado del servidor. Todo esto dificulta el navegador en sí y hace que las aplicaciones web sean menos útiles al introducir un paso adicional. Todavía puede hacer todas estas cosas si carga a través de ajax, reescribe enlaces y publica. Si eso no funciona, rpc remoto a través de php o cualquier idioma. Es absurdo que esto sea un problema para el codificador promedio.
Yitzhak
3

Descubrí que el uso de la versión XFBML del botón Me gusta de Facebook en lugar de la versión HTML5 solucionó este problema. Agregue el siguiente código donde desea que aparezca el botón:

<div id="fb-root"></div>
<script>(function (d, s, id) {
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) return;
    js = d.createElement(s); js.id = id;
    js.src = "//connect.facebook.net/en_GB/all.js#xfbml=1";
    fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>

<fb:like send="true" layout="button_count" width="50" show_faces="false" font="arial"></fb:like>

Luego agregue esto a su etiqueta HTML:

 xmlns:fb="http://ogp.me/ns/fb#"
Luke Alderton
fuente
2
¿Qué tiene que ver Facebook con esta pregunta?
Kukks
16
Porque también aparece este error en los botones Me gusta de Facebook y encontré esta página cuando buscaba una respuesta, así que pensé que otros podrían necesitarla.
Luke Alderton
1

El problema es que incluso si crea un proxy o carga el contenido y lo inyecta como si fuera local, cualquier script que ese contenido defina se cargará desde el otro dominio y causará problemas entre dominios.

usuario2345833
fuente