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:
http://www.example.org
e http://www.example2.com
http://abc.example.org
e http://xyz.example.com
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!