web-dev-qa-db-fra.com

Tentative JavaScript non sécurisée d'accéder au cadre avec l'URL

Je reçois l'erreur ci-dessous lorsque j'essaie de définir une valeur de hachage sur l'URL parent d'iframe qui contient une autre URL de domaine:

Une tentative JavaScript non sécurisée pour accéder au cadre avec l'URL "URL1" à partir du cadre avec l'URL "URL2". Les domaines, protocoles et ports doivent correspondre.

Comment puis-je résoudre ce problème?

111
Atul

À partir d'un document enfant d'origine différente, vous n'êtes pas autorisé à accéder à la propriété location.hash de la fenêtre supérieure, mais vous pouvez définir la propriété location elle-même.

Cela signifie que, étant donné que l'emplacement supérieur de la fenêtre est http://example.com/page/, au lieu de le faire

parent.location.hash = "#foobar";

vous devez connaître l'emplacement des parents et faire

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

Étant donné que la ressource n'est pas consultée, cela fonctionnera comme prévu, ne modifiant que la partie de hachage de l'URL.

Si vous utilisez ceci pour la communication entre domaines, je vous conseillerais plutôt d'utiliser easyXDM .

123
Sean Kinsey

Le crossframe-scripting n'est pas possible lorsque les deux cadres ont des domaines différents -> Sécurité.

Voir ceci: http://javascript.about.com/od/reference/a/frame3.htm

Maintenant, pour répondre à votre question: il n’ya pas de solution ou de solution de contournement, vous devez simplement vérifier la conception de votre site Web pour savoir pourquoi il doit y avoir deux cadres de différents domaines qui modifient l’URL de l’autre.

13
EvilMM

Je recevais le même message d'erreur lorsque j'ai essayé de chanter le domaine pour iframe.src.

Pour moi, la réponse a été de remplacer l'iframe.src par une URL du même domaine, mais en réalité une page de redirection html vers le domaine souhaité. L'autre domaine est ensuite apparu dans mon iframe sans aucune erreur.

Travaillé comme un charme. :)

9
Tommy

Une solution pourrait être d'utiliser un fichier local qui récupère le contenu distant

remoteInclude.php

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

Le HTML

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

J'ai constaté que l'utilisation de la version XFBML du bouton "J'aime" de Facebook au lieu de la version HTML5 corrigeait ce problème. Ajoutez le code ci-dessous à l'endroit où vous souhaitez que le bouton apparaisse:

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

Ajoutez ensuite ceci à votre balise HTML:

 xmlns:fb="http://ogp.me/ns/fb#"
3
Luke Alderton

Le problème est que, même si vous créez un proxy ou chargez le contenu et l'injectez comme s'il était local, tous les scripts que ce contenu définit seront chargés à partir de l'autre domaine et causeront des problèmes inter-domaines.

1
user2345833