web-dev-qa-db-fra.com

Erreur "Accès refusé" lors de l'accès à l'objet document iframe

Pour publier des formulaires AJAX dans un formulaire avec de nombreux paramètres, j'utilise une solution consistant à créer un iframe, à y poster le formulaire par POST, puis à accéder au iframe's content. spécifiquement, j'accède au contenu comme ceci:

$("some_iframe_id").get(0).contentWindow.document

Je l'ai testé et cela a fonctionné.

Sur certaines pages, j'ai commencé à obtenir une erreur "Accès refusé". Pour autant que je sache, cela ne devrait pas se produire si l'iframe est servi à partir du même domaine.

Je suis presque sûr que cela fonctionnait auparavant. Quelqu'un a une idée?

Si je ne suis pas assez clair: je poste sur le même domaine. Ce n'est donc pas une demande interdomaine. Je teste sur IE uniquement.

P.S. Je ne peux pas utiliser de simples ajax POST (ne demandez pas ...)

25
Ovesh

Résolu par moi-même!

Le problème était que, même si la réponse correcte était envoyée (vérifiée avec Fiddler), elle était envoyée avec un code d'erreur HTTP 500 (au lieu de 200).

Il s'avère donc que si une réponse est envoyée avec un code d'erreur, IE remplace le contenu du iframe par un message d'erreur chargé à partir du disque (res://ieframe.dll/http_500.htm), ce qui provoque l'erreur de refus d'accès entre domaines.

50
Ovesh

Méfiez-vous des limitations de sécurité associées à iFrames, comme Restriction inter-domaines (aka CORS). Voici 3 erreurs courantes liées à CORS:

  1. Chargez une iFrame avec un domaine différent. (Ex: ouverture " www.foo.com " tandis que le cadre supérieur est " www.ooof.com ")

  2. Chargez une iFrame avec un port différent: le port URL de l'iFrame diffère de celui du cadre supérieur.

  3. Différents protocoles: chargement de la ressource iFrame via HTTPS tandis que le cadre parent utilise HTTP.

6
Gal Blank

Mon problème était le X-Frame-Options En-tête HTTP. Ma configuration Apache est définie sur:

Header always append X-Frame-Options DENY

Le retirer lui a permis de fonctionner. Plus précisément, dans mon cas, j'utilisais le transport iframe pour jQuery avec le plugin de téléchargement de fichiers jQuery pour télécharger des fichiers dans IE 9 et IE 10.

3
gak

Je sais que cette question est super ancienne, mais je voulais mentionner que la réponse ci-dessus a fonctionné pour moi: définir le document.domain pour qu'il soit le même sur chacune des pages - la page parent et la page iframe. Cependant dans ma recherche, j'ai trouvé cet article intéressant:

http://softwareas.com/cross-domain-communication-with-iframes

2
Groovetrain

Notez si vous avez un iframe avec src='javascript:void(0)' puis javascript comme frame.document.location =... échouera avec l'erreur Accès refusé dans IE. J'utilisais une bibliothèque javascript qui interagit avec un cadre cible. Même si l'emplacement dans lequel il essayait de changer le cadre était sur le même domaine que le parent, l'iframe a été initialement défini sur javascript: void, ce qui a déclenché l'erreur de refus d'accès entre domaines.

Pour résoudre ce problème, j'ai créé une page blank.html dans mon site et si je dois déclarer à l'avance un iframe qui sera initialement vide jusqu'à ce qu'il soit modifié via javascript, je le pointe vers la page vierge afin que src='/content/blank.html' est dans le même domaine.

Alternativement, vous pouvez créer l'iframe complètement via javascript afin que vous puissiez définir le src lors de sa création, mais dans mon cas, j'utilisais une bibliothèque qui exigeait qu'un iframe soit déjà déclaré sur la page.

2
AaronLS