Tentative JavaScript non sécurisée pour accéder au cadre avec une URL

112

J'obtiens 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:

JavaScript non sécurisé tente d'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?

Atul
la source
3
Veuillez ajouter plus de détails, des extraits de code, un message d'erreur, le cadre que vous utilisez .. Plus de verbosité, plus de détails ..
fifigyuri
5
Qu'en est-il lorsque vous implémentez g + 1, facebook like ou shre et les plugins sociaux Twitter qui se chargent dans des iframes et lancent la même erreur?
La question est: POURQUOI les scripts Facebook et Google ESSAIENT même d'accéder aux éléments de mon site Web.
sergio

Réponses:

124

À partir d'un document enfant d'origine différente, vous n'êtes pas autorisé à accéder à la location.hashpropriété de la fenêtre supérieure , mais vous êtes autorisé à définir la locationpropriété 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 faire

parent.location.hash = "#foobar";

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

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

Comme la ressource n'est pas parcourue, cela fonctionnera comme prévu, en changeant uniquement la partie hachée de l'URL.

Si vous l'utilisez pour la communication inter-domaines, je vous recommande d'utiliser easyXDM à la place.

Sean Kinsey
la source
13
Personne n'a marqué cela comme la réponse et pourtant il a 60 votes positifs. Il devrait y avoir un badge pour cela.
zachzurn
35
Comment s'appellerait le badge? "A répondu à une personne paresseuse"
nzifnab
1
Hé @atul, soyez gentil et marquez cette réponse comme la meilleure. Soyez respectueux avec les conventions qui nous permettent à tous de bénéficier de la connaissance des autres ...
Clint Eastwood
13

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'y a pas de solution ou de contournement, vous devriez simplement vérifier la conception de votre site Web pourquoi il doit y avoir deux cadres de domaines différents qui changent l'URL de l'autre.

EvilMM
la source
82
Il s'agit d'une exigence fréquente lorsque l'on intègre une application tierce dans votre site Web, en particulier lorsque les services Web et autres ne sont pas une option.
Jacques
9

J'obtenais le même message d'erreur lorsque j'ai essayé de changer le domaine pour iframe.src.

Pour moi, la réponse était de changer l'iframe.src en une URL sur le même domaine, mais qui était en fait une page de redirection html vers le domaine souhaité. L'autre domaine est ensuite apparu dans mon iframe sans aucune erreur.

A fonctionné comme un charme. :)

Tommy
la source
Pouvez-vous nous expliquer plus précisément ce que vous avez fait ici?
Devin G Rhode
ce serait vraiment utile si vous pouviez expliquer brièvement.
Madhusudhan
2
Ne fonctionne pas dans le dernier Chrome: il ne vérifie pas le paramètre src, mais l'URL réelle chargée. Donc, l'astuce de redirection n'aide malheureusement en aucune façon :-(
lucaferrario
3
Je crois que ce à quoi Tommy fait référence est un proxy côté serveur. Voir par exemple benalman.com/projects/php-simple-proxy ou developer.yahoo.com/javascript/howto-proxy.html ou google.com/… ou la solution de René de Kat sur stackoverflow.com/a/11224975/27938
Oskar Austegard
C'est chouette. Mais cela illustre simplement à quel point il est généralement trivial de contourner ce problème. D'accord, supposons que je suis un pirate malveillant malveillant et que je souhaite lancer des attaques de script inter-domaines. Il y a de fortes chances que je connaisse ces outils et que je les utilise. En ce qui concerne les correctifs de sécurité du navigateur, cela est facilement aussi retardé que IE ne vous permettant pas d'exécuter Javascript localement sans avertissement. Ne résout aucun problème. Crée un tas de nouveaux.
Yitzhak
6

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();
});


la source
1
Cela ouvre la porte à des vulnérabilités de scripts intersites. Un exemple d'attaque possible: 1. Je crée une page sur myevilserver.com qui ressemble exactement à votre site, y compris un formulaire de connexion qui POST à ​​nouveau sur myevilserver.com 2. J'envoie une fausse newsletter à vos utilisateurs avec un lien vers https: // yoursite.com/remoteInclude.php?url=myevilserver.com 3. Ils voient un formulaire de connexion sur votre site que je capture sur mon serveur.
EricP
2
Une solution possible est de faire en sorte que remoteInclude.php vérifie toutes les URL par rapport à une liste de domaines pré-approuvée.
EricP
Cela ne résout pas les problèmes de vulnérabilité de script intersite. Il n'y a absolument rien que je puisse faire avec Javascript sur un site Web externe que je ne puisse pas faire du côté serveur. Tout cela fait obstacle au navigateur lui-même et rend les applications Web moins utiles en introduisant une étape supplémentaire. Vous pouvez toujours faire tout cela si vous chargez via ajax, réécrivez les liens et publiez en arrière. Si cela ne fonctionne pas, rpc à distance via php ou n'importe quel langage. Il est absurde que ce soit même un problème pour le codeur moyen.
Yitzhak
3

J'ai trouvé que l'utilisation de la version XFBML du bouton J'aime de Facebook au lieu de la version HTML5 a résolu 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#"
Luke Alderton
la source
2
Qu'est-ce que Facebook a à voir avec cette question?
Kukks
16
Parce que vous obtenez également cette erreur sur les boutons comme Facebook et j'ai trouvé cette page lors de la recherche d'une réponse, alors j'ai pensé que d'autres pourraient avoir besoin de la réponse.
Luke Alderton
1

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 définis par ce contenu seront chargés à partir de l'autre domaine et causeront des problèmes entre domaines.

utilisateur2345833
la source