Errore: authorization negata per accedere alla proprietà “documento”

Ho un documento HTML che contiene un iframe . Ogni volta che provo ad accedere o modificare questo iframe con JS ottengo l’ Error: Permission denied to access property "document" .

Sto usando frame.contentWindow.document.body.innerHTML o frame.contentWindow.document.body.onload o simili tali attributi per accedere o modificare l’ iframe . (Nel codice dato l’ iframe è chiamato frame ).

Per l’app web che sto sviluppando, l’accesso a questi attributi è necessario e non posso fare a meno di questi (o di alternative simili).

L’accesso e la modifica delle pagine Web negli iframe di altri siti Web è noto come Cross-site scripting o XSS ed è una tecnica utilizzata dagli hacker malintenzionati per depredare le vittime ignare.

Una politica denominata “Same-Origin Policy” è implementata dai creatori di browser per impedire tale comportamento e l’esecuzione arbitraria del codice JS.

Questo errore può essere evitato ospitando il documento principale e il documento iframe nello stesso dominio e sottodominio e assicurandosi che i documenti vengano caricati utilizzando lo stesso protocollo.

Esempi di pagine incompatibili:

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

La condivisione delle risorse tra origini è una soluzione a questo problema.

Per esempio:
Se http://www.example.com desidera condividere http://www.example.com/hello con http://www.example.org , è ansible inviare un’intestazione con il documento simile al seguente:

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

Per inviarlo con HTML basta inserirlo in un , in questo modo:

  ...  ...  

Puoi usare postMessage

Finestra 1 – ricezione

 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; // ... } 

Finestra – 2 Trasmissione

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

Devi creare un’altra coppia per intercomunicare.

È ancora ansible aggirare questo problema con l’aiuto di YQL anche se non si ha accesso alla parte di intestazione della finestra di ricezione. Con il metodo Postmessage è anche necessario modificare lo script della finestra del destinatario. Ma usando questo metodo puoi caricare qualsiasi iframe senza toccare i loro script. Controllalo!