¿Qué hace document.domain = document.domain?

90

El componente JS del lado del cliente de Orbited (un servidor Comet), requiere que si el servidor se está ejecutando en un dominio o puerto diferente al propio JS, debe ejecutar

document.domain = document.domain;

antes de que se cargue cualquier otro JS. (Consulte la documentación ).

¿Qué hace esto? ¡Parece un NOOP! (Lo he comprobado y de hecho es necesario).

mjs
fuente

Respuestas:

203

De hecho, escribí este código.

Al intentar hacer un cometa de subdominio / puerto cruzado, el iframe debe tener el mismo document.domainvalor que el marco principal. Desafortunadamente, el navegador almacena el nombre de dominio Y el puerto internamente para el document.domainvalor original . Pero el getter y setter en javascript no sabe nada sobre el puerto. Entonces, el problema es este: si el marco superior document.domaines ('example.com', 80)y el marco inferior es ('comet.example.com', 80), ¿cómo se consigue que el marco inferior ('example.com', 80)también sea?

No puede, ya que cambiar la parte del nombre de host necesariamente hará que el puerto se establezca en null, por lo que lo mejor que puede hacer es ('example.com', null)en el marco inferior. Por lo tanto, el marco superior también debe establecerse en ese valor, y la configuración document.domain=document.domainhace precisamente eso. Cambia la representación interna en el navegador de ('example.com', 80)a ('example.com', null)y luego todo coincide y funciona la comunicación entre puertos / subdominios.

Michael Carter
fuente
Desafortunadamente, esta solución no me ha funcionado (consulte stackoverflow.com/questions/7796767/… para obtener más detalles). Agregar 'document.domain = document.domain' a todos los marcos no cambia el comportamiento de Chrome. ¿Algunas ideas?
Stephen Gross
Además, descubrí que si establezco un retraso para mi js, al menos obtengo URL de aspecto válido para ambos marcos. Sin embargo, un fotograma no puede acceder al otro.
Stephen Gross
6
Hay otra explicación de cómo funciona el extraño puerto "oculto" en MDN: developer.mozilla.org/en/Same_origin_policy_for_JavaScript
mjs
1
Ah, entonces usted es el culpable de este código exasperante. Gracias a dicha línea, después de que se ha ejecutado (y document.domain configurado) cualquier iframe creado dinámicamente se establece como dominio cruzado y, por lo tanto, ya no se puede acceder al iframe recién creado. : /
mierda
@mjs sí: el navegador guarda el número de puerto por separado. Cualquier llamada al establecedor, incluido document.domain = document.domain hace que el número de puerto se sobrescriba con nulo. Por lo tanto, no se puede hacer que company.com:8080 hable con company.com configurando solo document.domain = "company.com" en el primero. Debe configurarse en ambos para que los números de puerto sean nulos.
Royi Namir
38

Los navegadores distinguen entre (a) document.domain cuando no se establece explícitamente y (b) document.domain cuando se establece explícitamente ... incluso si devuelven el mismo valor.

Establecer explícitamente el valor indica la intención de "cooperar" con un script en otro subdominio (bajo el mismo dominio principal).

Si AMBOS la página principal Y el script externo establecen explícitamente document.domain en el mismo valor, la restricción de la política del mismo origen puede ser omitida y cada script puede acceder a todos los objetos y propiedades (de otra manera restringidos) de los contextos de los demás.

semanalmente
fuente
9

Encontré la siguiente información en este sitio: devguru . Más concretamente, aquí está la cita:

Esta propiedad establece o devuelve el nombre de dominio del servidor desde el que se originó el documento. Este valor predeterminado es el nombre de dominio del servidor del que se recuperó el documento, pero se puede cambiar a un sufijo (y solo un sufijo) de este nombre. Esto permite compartir las propiedades del script, lo que permite la seguridad, entre documentos entregados desde diferentes servidores siempre que compartan el mismo sufijo de dominio.

Me parece que permite el scripting entre sitios para el mismo dominio (incluso si el subdominio es diferente).

Supongo que si no toca document.domain, el motor js solo permite otros javascripts del mismo dominio. Con esa propiedad, podrá implementar en otros subdominios como el estado de documentos en órbita.

Miguel Ping
fuente
6
Eso no explica por qué nodocument.domain = document.domain es un NOOP.
Crescent Fresh
1
Solo una suposición salvaje, pero como dije, supongo que la propiedad solo se activa cuando se establece en un valor.
Miguel Ping
6

La document.domaintira de un defecto de la URL real si no se establece de manera explícita. Los navegadores registrarán si document.domainprocede de forma predeterminada de la URL o si se estableció explícitamente. Ambos deben ser predeterminados para el mismo dominio o ambos deben configurarse explícitamente en el mismo dominio para que esto funcione. Si uno es el predeterminado y el otro está configurado explícitamente, ambos coinciden si se leen, las dos páginas aún tendrán prohibido comunicarse entre sí.

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

Charlie
fuente