2016-03-31 14 views
10

Ich habe ein HTML-Dokument, das eine iframe enthält. Immer wenn ich versuche, diese iframe mit JS zuzugreifen oder zu ändern, bekomme ich Error: Permission denied to access property "document".Fehler: Zugriff verweigert Eigenschaft "Dokument"

Ich verwende frame.contentWindow.document.body.innerHTML oder frame.contentWindow.document.body.onload oder ähnliche solche Attribute, um auf die iframe zuzugreifen oder sie zu ändern. (In dem angegebenen Code wird die iframe als frame bezeichnet.)

Für die Web-App, die ich entwickle, ist der Zugriff auf diese Attribute notwendig und ich kann nicht ohne diese (oder ähnliche Alternativen) auskommen.

Antwort

11

Zugriff und dann Webseite in iframe s von anderen Websites sind bekannt als Cross-site scripting oder XSS und es ist eine Technik, die von böswilligen Hackern Modifizierung auf ahnungslose Opfer zu jagen.

Eine Richtlinie mit dem Namen "Same-Origin Policy" wird von Browserherstellern implementiert, um ein solches Verhalten und die willkürliche Ausführung von JS-Code zu verhindern.

Dieser Fehler kann verhindert werden, indem das übergeordnete Dokument und das Dokument in der gleichen Domäne und Sub-Domäne in der iframe gehostet werden, und sicherstellen, dass die Dokumente mit demselben Protokoll geladen werden.

Beispiele inkompatibler Seiten:

  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 ist eine Lösung für dieses Problem.

Beispiel:
Wenn http://www.example.com möchte http://www.example.com/hello mit http://www.example.org teilen, kann ein Header mit dem Dokument gesendet werden, die wie folgt aussieht:

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

Um es mit HTML zu senden in einem legst du es einfach <META HTTP-EQUIV="..."> Tag, wie folgt aus:

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

Was ist, wenn ich keinen Zugriff auf den "Kopf" -Teil der Seite habe? Ich versuche ein Widget in Squarespace einzubetten. –

+0

@PJBrunet Leider hast du kein Glück ...Ich kann Ihnen vielleicht helfen, wenn Sie die Details über das Widget angeben und was Sie ändern möchten. – sbrm1

+1

Ich würde hier lieber nicht chatten, was StackOverflow runzelt. Squarespace erlaubt tatsächlich den Zugriff auf "Kopf", aber Ihre Lösung hat nicht geholfen, weil ich auf einer anderen Domain bin. Am Ende habe ich mein Problem gelöst, indem ich die URL des iframes nach einem Event änderte und dann die neue iframe-URL meine Parameter wie zipcode = 12345 –

3

können Sie verwenden postMessage

Fenster 1 - 2 Übermittlungs-

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

Sie haben ein anderes Paar zu schaffen, um miteinander kommunizieren -

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; 

    // ... 
} 

Fenster erhalten.