2016-03-31 3 views
10

J'ai un document HTML qui contient un iframe. Chaque fois que j'essaie d'accéder ou de modifier ce iframe avec JS je reçois Error: Permission denied to access property "document". J'utilise frame.contentWindow.document.body.innerHTML ou frame.contentWindow.document.body.onload ou des attributs similaires pour accéder ou modifier le iframe. (Dans le code donné le iframe est désigné comme frame.)Erreur: Autorisation refusée pour accéder à la propriété "document"

Pour l'application web que je développe, l'accès à ces attributs est nécessaire et je ne peux pas m'en passer (ou des alternatives similaires).

Répondre

11

Accès, puis modifier les pages Web dans iframe s d'autres sites est connu sous le nom Cross-site scripting ou XSS et il est une technique utilisée par des pirates malveillants à la proie sur les victimes sans méfiance.

Une politique du nom de «politique de même origine» est mise en œuvre par les fabricants de navigateurs pour empêcher un tel comportement et l'exécution arbitraire du code JS.

Cette erreur peut être évitée en hébergeant le document parent et le document dans le iframe dans le même domaine et sous-domaine, et en vérifiant que les documents sont chargés en utilisant le même protocole.

Des exemples de incompatibles Pages:

  1. http://www.example.org & http://www.example2.com
  2. http://abc.example.org & http://xyz.example.com
  3. http://www.example.org & https://www.example.com

Cross-Origin Resource Sharing est une solution à ce problème.

Exemple:
Si http://www.example.com aimerait partager http://www.example.com/hello avec http://www.example.org, un en-tête peut être envoyé avec le document qui ressemble à ce qui suit:

Access-Control-Allow-Origin: http://www.example.org 

Pour envoyer avec HTML il suffit de mettre dans un tag <META HTTP-EQUIV="...">, comme ceci:

<head> 
    ... 
    <META HTTP-EQUIV="Access-Control-Allow-Origin" CONTENT="http://www.example.org"> 
    ... 
</head> 
+0

J'essaie d'intégrer un widget dans Squarespace. –

+0

@PJBrunet Malheureusement, vous n'avez pas de chance ...Je pourrais être en mesure de vous aider si vous donnez des détails sur le widget et ce que vous essayez de modifier. – sbrm1

+1

Je préfère ne pas discuter ici, ce que StackOverflow fronce les sourcils. Squarespace permet en effet d'accéder à la "tête" mais votre solution n'a pas aidé car je suis sur un autre domaine. J'ai fini par résoudre mon problème en changeant l'URL de l'iframe après un événement, et puis la nouvelle URL iframe a inclus mes paramètres comme zipcode = 12345 –

3

Vous pouvez utiliser postMessage

fenêtre 1 - réception

window.addEventListener("message", receiveMessage, false); 

function receiveMessage(event) 
{ 
    var origin = event.origin || event.originalEvent.origin; 
    // For Chrome, the origin property is in the event.originalEvent object. 
    if (origin !== "http://example.org:8080") 
    return; 

    // ... 
} 

Fenêtre - 2 Transmettant

var popup = window.open(...popup details...); 
popup.postMessage(
     "The user is 'bob' and the password is 'secret'", 
     "https://secure.example.net" 
); 

Vous devez créer une autre paire à intercommunication. Et si je n'ai pas accès à la partie "tête" de la page?