2009-09-26 5 views
73

Il componente lato client JS di Orbited (un server Comet), prevede che, se il server è in esecuzione su un dominio diverso o una porta per il JS in sé, è necessario eseguireCosa fa document.domain = document.domain?

document.domain = document.domain; 

prima di ogni altra JS viene caricato . (Vedi documentation.)

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

risposta

175

Ho effettivamente scritto questo codice.

Quando si tenta di eseguire cross-subdomain/port comet, l'iframe deve avere lo stesso valore document.domain come frame principale. Sfortunatamente, il browser memorizza internamente il nome del dominio e la porta per il valore originale document.domain. Ma il getter e setter in javascript non sa nulla del porto. Quindi il problema è questo: se il frame superiore document.domain è ('example.com', 80), e il frame in basso è ('comet.example.com', 80), come si ottiene il frame inferiore come ('example.com', 80)?

Non è possibile, come cambiare la parte hostname sarà necessariamente causare la porta ad essere impostata su null, quindi la cosa migliore che puoi fare è ('example.com', null) nel frame inferiore. Quindi anche il frame superiore deve essere impostato su quel valore e l'impostazione di document.domain=document.domain fa proprio questo. Cambia la rappresentazione interna nel browser da ('example.com', 80) a ('example.com', null) e quindi tutto corrisponde alle opere di comunicazione frame cross-port/sottodominio.

+80

+1 per la prima frase :) –

+0

Purtroppo questa soluzione non ha funzionato per me (vedi http://stackoverflow.com/questions/7796767/is-it-possibile-al-tuo-uno-frame-da-altre- using-javascript per i dettagli). L'aggiunta di "document.domain = document.domain" a tutti i frame non cambia il comportamento di Chrome. Qualche idea? –

+0

Inoltre, ho capito che se avessi impostato un ritardo per il mio js, ​​avrei almeno degli URL validi per entrambi i frame. Tuttavia, un frame non può accedere all'altro. –

9

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

Questa proprietà imposta o restituisce il nome dominio del server da cui il documento ha avuto origine. Questo valore predefinito è per il nome di dominio del server che è stato ritirato da , ma può essere modificato in un suffisso (e solo un suffisso ) di questo nome. Ciò consente alla condivisione di proprietà di script, la sicurezza consentita, tra i documenti consegnati da diversi server che forniscono condivide lo stesso suffisso di dominio.

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

Suppongo che se non si tocca document.domain, il motore js consente solo altri javascript dello stesso dominio. Con questa proprietà, sarai in grado di distribuirli ad altri sottodomini come lo stato dei documenti orbitati.

+6

che non spiega il motivo per cui 'document.domain = document.domain' * non * è un NOOP. –

+1

Solo un'ipotesi selvaggia, ma come ho detto suppongo che la proprietà venga attivata solo quando è impostata su un valore. –

29

Browser distinguono tra (a) document.domain quando non è impostata in modo esplicito e (b) document.domain quando è impostato in modo esplicito ... anche se restituiscono lo stesso valore.

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

Se ENTRAMBI la pagina principale E lo script esterno impostano esplicitamente il documento.dominio allo stesso valore, la restrizione della politica dell'origine stessa può essere ignorata e ogni script può accedere a tutti gli oggetti e le proprietà (altrimenti limitati) dei rispettivi contesti.

+5

La prima frase è un dettaglio estremamente critico per comprendere questo problema. Grazie! –

+0

Sei il benvenuto! Sono contento che sia stato utile. :) – cweekly

6

Il document.domain estrae un valore predefinito dall'URL effettivo se non impostato in modo esplicito. I browser registreranno se document.domain è venuto come predefinito dall'URL o se è stato impostato in modo esplicito. Entrambi devono essere predefiniti per lo stesso dominio o entrambi devono essere impostati in modo esplicito sullo stesso dominio affinché funzioni. Se uno è predefinito e uno è impostato in modo esplicito, entrambi corrispondenti se letti, le due pagine saranno comunque vietate a parlare tra loro.

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