Cosa fa document.domain = document.domain?


90

Il componente JS lato client di Orbited (un server Comet), richiede che se il server è in esecuzione su un dominio diverso o porta a JS stesso, è necessario eseguire

document.domain = document.domain;

prima che venga caricato qualsiasi altro JS. (Vedi il documentazione .)

Cosa fa questo? Sembra un NOOP! (Ho controllato ed è in effetti necessario.)

Risposte:


202

In realtà ho scritto questo codice.

Quando si tenta di eseguire la cometa cross-sottodomain / port, l'iframe deve avere lo stesso document.domainvalore del frame principale. Sfortunatamente, il browser memorizza internamente il nome di dominio E la porta per il document.domainvalore originale . Ma il getter e il setter in javascript non sanno nulla della porta. Quindi il problema è questo: se lo document.domainè il frame superiore ('example.com', 80)e lo è il frame inferiore ('comet.example.com', 80), come si fa a fare in modo che sia anche il frame inferiore ('example.com', 80)?

Non è possibile, poiché la modifica della parte del nome host causerà necessariamente l'impostazione della porta null, quindi il meglio che puoi fare è ('example.com', null)nel frame inferiore. Quindi anche il frame superiore deve essere impostato su quel valore e l'impostazione document.domain=document.domainfa proprio questo. Cambia la rappresentazione interna nel browser da ('example.com', 80)a, ('example.com', null)quindi tutto corrisponde e la comunicazione del frame cross-port / sottodominio funziona.


Questa soluzione purtroppo non ha funzionato per me (vedi stackoverflow.com/questions/7796767/… per i dettagli). L'aggiunta di "document.domain = document.domain" a tutti i frame non modifica il comportamento di Chrome. Qualche idea?
Stephen Gross,

Inoltre, ho capito che se imposto un ritardo per il mio js, ​​ottengo almeno URL dall'aspetto valido per entrambi i frame. Tuttavia, un frame non può accedere all'altro.
Stephen Gross il

6
C'è un'altra spiegazione di come funziona la strana porta "nascosta" su MDN: developer.mozilla.org/en/Same_origin_policy_for_JavaScript
mjs

1
Ah, quindi sei il colpevole di questo codice esasperante. Grazie a questa linea, dopo che è stato eseguito (e document.domain impostato) qualsiasi iframe creato dinamicamente viene impostato come interdominio e quindi non è più possibile accedere all'iframe appena creato. : /
schifoso il

@mjs yes: il numero di porta viene mantenuto separatamente dal browser. Qualsiasi chiamata al setter, incluso document.domain = document.domain, fa sì che il numero di porta venga sovrascritto con null. Pertanto non si può far parlare company.com:8080 con company.com impostando solo document.domain = "company.com" nel primo. Deve essere impostato in entrambi in modo che i numeri di porta siano entrambi nulli.
Royi Namir

38

I browser distinguono tra (a) document.domain quando non è impostato esplicitamente e (b) document.domain quando è impostato esplicitamente ... anche se restituiscono lo stesso valore.

L'impostazione esplicita del valore indica l'intenzione di "cooperare" con uno script su un altro sottodominio (sotto lo stesso dominio padre).

Se SIA la pagina principale CHE lo script esterno impostano esplicitamente document.domain sullo stesso valore, la restrizione della politica della stessa origine può essere aggirata e ogni script può accedere a tutti gli oggetti (altrimenti limitati) e alle proprietà dei rispettivi contesti.


9

Ho trovato le seguenti informazioni su questo sito: devguru . Più concretamente, ecco la citazione:

Questa proprietà imposta o restituisce il nome di dominio del server da cui ha avuto origine il documento. L'impostazione predefinita è il nome di dominio del server da cui è stato recuperato il documento, ma può essere modificato in un suffisso (e solo un suffisso) di questo nome. Ciò consente la condivisione di proprietà di script, protezione consentita, tra documenti consegnati da server diversi a condizione che condividano lo stesso suffisso di dominio.

Mi sembra che consenta il cross site scripting per lo stesso dominio (anche se il sottodominio è diverso).

Suppongo che se non tocchi document.domain, il motore js consente solo altri javascript dallo stesso dominio. Con questa proprietà, sarai in grado di eseguire il deployment in altri sottodomini come lo stato dei documenti in orbita.


6
Questo non spiega perché nondocument.domain = document.domain è un NOOP.
Crescent Fresh,

1
Solo un'ipotesi folle, ma come ho detto immagino che la proprietà venga attivata solo ogni volta che è impostata su un valore.
Miguel Ping,

6

Il document.domaintira un default dal URL effettivo se non impostata in modo esplicito. I browser registreranno se document.domainè arrivato come predefinito dall'URL o se è stato impostato esplicitamente. Entrambi devono essere un valore predefinito per lo stesso dominio o entrambi devono essere impostati esplicitamente sullo stesso dominio affinché funzioni. Se uno è predefinito e uno è impostato esplicitamente, entrambi corrispondenti se letti, alle due pagine sarà comunque vietato parlare tra loro.

Vedi: https://developer.mozilla.org/en-US/docs/DOM/document.domain

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.