2016-03-31 12 views
10

Ho un documento HTML che contiene un iframe. Ogni volta che provo ad accedere o modificare questo iframe con JS ottengo Error: Permission denied to access property "document".Errore: Autorizzazione negata per accedere alla proprietà "documento"

Sto usando frame.contentWindow.document.body.innerHTML o frame.contentWindow.document.body.onload o simili tali attributi per accedere o modificare il iframe. (Nel codice indicato il iframe è denominato frame.)

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

risposta

11

Accesso e quindi modificando le pagine web in iframe s di altri siti web è conosciuto come Cross-site scripting o XSS ed è una tecnica utilizzata dagli hacker malintenzionati per depredare vittime ignare.

Una politica denominata "Same-Origin Policy" è implementata dai produttori 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 nello 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 & 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 è una soluzione a questo problema.

Per esempio:
Se http://www.example.com vorrebbe condividere http://www.example.com/hello con http://www.example.org, un colpo di testa può essere inviato con il documento che si presenta come il seguente:

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

per inviarlo con l'HTML appena messo in un <META HTTP-EQUIV="..."> tag, in questo modo:

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

Cosa succede se non ho accesso alla parte "testa" della pagina? Sto cercando di incorporare un widget in Squarespace. –

+0

@PJBrunet Sfortunatamente, sei sfortunato ...Potrei essere in grado di aiutarti se fornisci i dettagli sul widget e su cosa stai cercando di modificare. – sbrm1

+1

Preferisco non chattare qui, che StackOverflow aggrotta le sopracciglia. Squarespace in effetti consente l'accesso a "head", tuttavia la tua soluzione non ha aiutato perché sono su un altro dominio. Ho finito per risolvere il mio problema cambiando l'URL dell'iframe dopo un evento, e quindi il nuovo URL iframe includeva i miei parametri come zipcode = 12345 –

3

È possibile utilizzare postMessage

Window 1 - ricevere

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; 

    // ... 
} 

Window - 2 Trasmissione

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

si deve creare un altro paio di comunicare tra loro.

Problemi correlati