227 votes

Accéder à l'URL parent à partir d'un iframe

Ok, j'ai une page sur et sur cette page j'ai un iframe. Ce que je dois faire, c'est trouver l'URL de la page principale sur la page de l'iframe.

J'ai fait des recherches et je sais que ce n'est pas possible si ma page iframe se trouve sur un domaine différent, car il s'agit de cross-site scripting. Mais tout ce que j'ai lu dit que si la page iframe est sur le même domaine que la page parent, cela devrait fonctionner si je fais par exemple :

parent.document.location

parent.window.document.location

parent.window.location

parent.document.location.href

... ou d'autres combinaisons similaires, car il semble y avoir plusieurs façons d'obtenir la même information.

Quoi qu'il en soit, voici le problème. Mon iframe est sur le même domaine que la page principale, mais il n'est pas sur le même domaine SUB. Ainsi, par exemple, j'ai

http:// www.mysite.com/pageA.html

et l'URL de mon iframe est

http:// qa-www.mysite.com/pageB.html

Lorsque j'essaie de récupérer l'URL de pageB.html (la page iframe), je continue à obtenir la même erreur d'accès refusé. Il semble donc que même les sous-domaines soient considérés comme des scripts intersites. Est-ce exact, ou est-ce que je fais quelque chose de mal ?

2 votes

Pouvez-vous simplement le passer dans l'URL du cadre ? Par exemple <iframe src="url?parent=parent-url"></iframe>

428voto

Vaibhav Points 831

Oui, l'accès à l'URL de la page parent n'est pas autorisé si l'iframe et la page principale ne se trouvent pas dans le même (sous-)domaine. Toutefois, si vous avez seulement besoin de l'URL de la page principale (c'est-à-dire l'URL du navigateur), vous pouvez essayer ceci :

var url = (window.location != window.parent.location)
            ? document.referrer
            : document.location.href;

Note :

window.parent.location est autorisé ; cela permet d'éviter l'erreur de sécurité dans l'OP, qui est causée par l'accès à l'adresse de l'utilisateur. href propriété : window.parent.location.href cause "Bloqué un cadre avec origine..."

document.referrer fait référence à "l'URI de la page qui renvoie à cette page". Cela peut pas retourner le contenant document si une autre source est à l'origine de la iframe l'emplacement, par exemple :

  • Container iframe @ Domaine 1
  • Envoie l'iframe enfant au domaine 2
  • Mais dans l'iframe enfant... Le domaine 2 redirige vers le domaine 3 (c'est-à-dire pour l'authentification, peut-être SAML), et ensuite le domaine 3 dirige dos au domaine 2 (c'est-à-dire via la soumission de formulaire(), une technique SAML standard)
  • Pour l'iframe enfant, le document.referrer sera Domaine 3 et non le domaine contenant 1

document.location fait référence à "un objet Location, qui contient des informations sur l'URL du document" ; on peut supposer que l'objet actuel le document, c'est-à-dire l'iframe actuellement ouvert. Lorsque window.location === window.parent.location alors l'élément de l'iframe href est le mismo en tant qu'élément du parent contenant href .

0 votes

Si les emplacements de la fenêtre et de la fenêtre parent sont différents, vous êtes à l'intérieur d'un iframe. Dans ce cas, il prend le referrer de l'iframe. Sinon, c'est la fenêtre principale, donc elle prend document.location (referrer n'est pas valide ici, puisque ce serait la page précédente et non le parent).

1 votes

@jepser c'est parce que votre iframe est à l'intérieur de cette iframe. vous n'aurez jamais accès au cadre supérieur avec celui du milieu. les iframes imbriquées inter-domaines sont mauvaises à bien des niveaux. mais vous pouvez peut-être contourner cela si vous définissez document.domain sur le cadre supérieur et le cadre intérieur. Peut-être.

0 votes

Cette réponse combinée à stackoverflow.com/a/5697801/216084 fait le travail.

62voto

Gregory Lewis Points 151

Je viens de découvrir une solution de contournement pour ce problème qui est si simple, et pourtant je n'ai trouvé aucune discussion nulle part qui le mentionne. Elle nécessite le contrôle du cadre parent.

Dans votre iFrame, disons que vous voulez cette iframe : src="http://www.example.com/mypage.php"

Au lieu d'utiliser du HTML pour spécifier l'iframe, utilisez un javascript pour construire le HTML de votre iframe, récupérez l'url parent par le biais du javascript "au moment de la construction", et envoyez-la comme paramètre url GET dans la chaîne de requête de votre cible src, comme suit :

<script type="text/javascript">
  url = parent.document.URL;
  document.write('<iframe src="http://example.com/mydata/page.php?url=' + url + '"></iframe>');
</script>

Ensuite, trouvez une fonction javascript d'analyse d'url qui analyse la chaîne d'url pour obtenir la variable url que vous recherchez, dans ce cas, c'est "url".

J'ai trouvé un excellent analyseur de chaîne url ici : http://www.netlobo.com/url_query_string_javascript.html

0 votes

Cette réponse combinée à stackoverflow.com/a/7739035/216084 fait le travail.

2 votes

C'était une merveilleuse suggestion. Pour ceux qui écrivent le code de l'iframe html parent, cela permettrait de payer la facture. Nous avons utilisé quelque chose de très similaire dans notre logiciel pixel.

0 votes

Merci ! Il s'agit d'une solution de contournement efficace qui respecte toujours les règles intersites.

38voto

ParPar Points 1584

Si votre iframe provient d'un autre domaine, (cross domain), vous devrez simplement utiliser ceci :

var currentUrl = document.referrer;

et - ici vous avez l'url principale !

0 votes

Cela n'a pas fonctionné dans mon cas, car je pense que l'iFrame lui-même a été généré dynamiquement ou a fait l'objet d'une autre astuce. En tout cas, je n'ai pas obtenu la réponse que j'attendais.

0 votes

Cela devrait fonctionner dans tous les navigateurs. Sauf dans les navigateurs plus récents si vous envoyez des paramètres de Sandboxing, mais je doute que ce soit le cas. Cela fonctionne indépendamment du cross domain.

0 votes

Si la page à l'intérieur de l'iframe s'est rechargée elle-même via javascript (par ex. window.location.reload(true) ) cela ne fonctionne plus. Le référent est alors l'URL de l'iframe elle-même.

30voto

Dan Herbert Points 38336

Vous avez raison. Les sous-domaines sont toujours considérés comme des domaines distincts lorsqu'ils utilisent des iframes. Il est possible de transmettre des messages en utilisant postMessage(...) mais d'autres API JS sont intentionnellement rendues inaccessibles.

Il est également toujours possible d'obtenir l'URL en fonction du contexte. Voir les autres réponses pour plus de détails.

4 votes

Vous POUVEZ interagir entre les 2. Mais vous devez ajouter le script suivant sur le parent et l'iframe : <script>document.domain="mondomaine.com";</script>

20voto

user409021 Points 126

Pour les pages situées sur le même domaine et sur un sous-domaine différent, vous pouvez définir l'attribut document.domain via javascript.

Le cadre parent et l'iframe doivent tous deux définir leur document.domain sur un élément qui leur est commun.

c'est-à-dire www.foo.mydomain.com y api.foo.mydomain.com pourraient chacun utiliser soit foo.mydomain.com ou simplement mydomain.com et être compatibles (non, vous ne pouvez pas les régler tous les deux sur com pour des raisons de sécurité...)

Notez également que document.domain est une rue à sens unique. Considérez l'exécution des trois déclarations suivantes dans l'ordre :

// assume we're starting at www.foo.mydomain.com
document.domain = "foo.mydomain.com" // works
document.domain = "mydomain.com" // works
document.domain = "foo.mydomain.com" // throws a security exception

Les navigateurs modernes peuvent également utiliser window.postMessage pour communiquer entre les origines, mais cela ne fonctionnera pas dans IE6. https://developer.mozilla.org/en/DOM/window.postMessage

3 votes

Veuillez accepter ceci comme la réponse, maintenant que c'est possible et que cette réponse apparaît dans les recherches Google.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X