O que document.domain = document.domain faz?

90

O componente JS do lado do cliente do Orbited (um servidor Comet) requer que se o servidor estiver sendo executado em um domínio ou porta diferente do próprio JS, você deve executar

document.domain = document.domain;

antes que qualquer outro JS seja carregado. (Veja a documentação .)

O que isso faz? Parece um NOOP! (Eu verifiquei e é de fato necessário.)

mjs
fonte

Respostas:

202

Na verdade, escrevi este código.

Ao tentar fazer cross-subdomain / port cometa, o iframe precisa ter o mesmo document.domainvalor que o quadro pai. Infelizmente, o navegador armazena o nome de domínio E a porta internamente para o document.domainvalor original . Mas o getter e o setter em javascript não sabem nada sobre a porta. Portanto, o problema é este: se o quadro superior document.domainé ('example.com', 80), e o quadro inferior é ('comet.example.com', 80), como você faz com que o quadro inferior ('example.com', 80)também seja?

Você não pode, pois alterar a parte do nome do host necessariamente fará com que a porta seja configurada como null, portanto, o melhor que você pode fazer é ('example.com', null)no quadro inferior. Portanto, o quadro superior também precisa ser definido com esse valor, e a configuração document.domain=document.domainfaz exatamente isso. Ele muda a representação interna no navegador de ('example.com', 80)para ('example.com', null)e, em seguida, tudo coincide e a comunicação de quadro de porta cruzada / subdomínio funciona.

Michael Carter
fonte
Infelizmente, essa solução não funcionou para mim (consulte stackoverflow.com/questions/7796767/… para obter detalhes). Adicionar 'document.domain = document.domain' a todos os frames não altera o comportamento do Chrome. Alguma ideia?
Stephen Gross,
Além disso, descobri que se eu definir um atraso para meu js, pelo menos obterei URLs de aparência válida para ambos os quadros. Ainda assim, um quadro não pode acessar o outro.
Stephen Gross,
6
Há outra explicação de como a estranha porta "oculta" funciona em MDN: developer.mozilla.org/en/Same_origin_policy_for_JavaScript
mjs
1
Ah, então você é o culpado por esse código irritante. Graças a essa linha, depois de ser executado (e document.domain definido), qualquer iframe criado dinamicamente é definido como entre domínios e, portanto, o iframe recém-criado não pode mais ser acessado. : /
péssimo
@mjs sim: o número da porta é mantido separadamente pelo navegador. Qualquer chamada para o setter, incluindo document.domain = document.domain faz com que o número da porta seja substituído por nulo. Portanto, não se pode fazer empresa.com:8080 falar com empresa.com apenas definindo document.domain = "empresa.com" no primeiro. Deve ser definido em ambos para que os números das portas sejam nulos.
Royi Namir
38

Os navegadores distinguem entre (a) document.domain quando não definido explicitamente e (b) document.domain quando definido explicitamente ... mesmo se retornarem o mesmo valor.

Definir explicitamente o valor indica a intenção de "cooperar" com um script em outro subdomínio (no mesmo domínio pai).

Se AMBOS a página pai E o script externo definirem explicitamente document.domain com o mesmo valor, a restrição de política de mesma origem pode ser ignorada e cada script pode acessar todos os objetos e propriedades (de outra forma restritos) dos contextos uns dos outros.

semanalmente
fonte
9

Encontrei as seguintes informações neste site: devguru . Mais concretamente, aqui está a citação:

Esta propriedade define ou retorna o nome de domínio do servidor de onde o documento se originou. O padrão é o nome de domínio do servidor do qual o documento foi recuperado, mas pode ser alterado para um sufixo (e apenas um sufixo) desse nome. Isso permite o compartilhamento de propriedades de script, permitindo a segurança, entre documentos entregues por servidores diferentes, desde que compartilhem o mesmo sufixo de domínio.

Parece-me que permite cross site scripting para o mesmo domínio (mesmo se o subdomínio for diferente).

Suponho que, se você não tocar em document.domain, o mecanismo js só permitirá outros javascripts do mesmo domínio. Com essa propriedade, você será capaz de implantar em outros subdomínios, como o estado de documentos orbitados.

Miguel Ping
fonte
6
Isso não explica por que nãodocument.domain = document.domain é um NOOP.
Crescent Fresh
1
Apenas um palpite, mas como eu disse, acho que a propriedade só é acionada quando é definida como um valor.
Miguel Ping
6

O document.domainpuxa um padrão do URL real se não for definido explicitamente. Os navegadores registrarão se document.domainveio como padrão da URL ou se foi definido explicitamente. Ambos devem ser um padrão para o mesmo domínio ou ambos devem ser explicitamente configurados para o mesmo domínio para que isso funcione. Se um for o padrão e o outro for explicitamente definido, ambos correspondentes se lidos, as duas páginas ainda serão proibidas de se comunicarem.

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

Charlie
fonte