Si tu sitio web depende de la configuración de document.domain
, debes realizar una acción.
Actualizaciones
- 30 de mayo de 2023: Anunciamos que la baja del set de
document.domain
será efectiva en Chrome 115. - 7 de abril de 2023: Identificamos un problema antes de enviar este cambio en Chrome 112. Actualmente, se suspendió el set de
document.domain
que se quitará de forma predeterminada, y aún no se determina el nuevo evento importante de envío. Vuelve a consultar esta entrada de blog o suscríbete a blink-dev y a esta conversación. - 20 de enero de 2023: Cronograma actualizado. Se quitará
document.domain
método set de forma predeterminada a partir de Chrome 112. Además, se agregó una mención a la política empresarial para controlar el comportamiento dedocument.domain
. - 25 de julio de 2022: Cronograma actualizado: El set de
document.domain
se quitará de forma predeterminada a partir de Chrome 109. - 4 de febrero de 2022: Se actualizó con el nuevo cronograma. Mostraremos una advertencia en el panel de problemas a partir de Chrome 100 y quitaremos el set
document.domain
de forma predeterminada a partir de Chrome 106.
document.domain
se diseñó para obtener o establecer el nombre de host del origen.
En Chrome, los sitios web no podrán configurar document.domain
. Deberás usar métodos alternativos, como postMessage()
o la API de Channel Messaging, para comunicar orígenes cruzados. Nuestro objetivo es lanzar este cambio en Chrome 112 lo antes posible, pero esto depende de la respuesta al Intento de lanzamiento.
Si tu sitio web depende de la relajación de las políticas de mismo origen a través de document.domain
para funcionar correctamente, deberá enviar un encabezado Origin-Agent-Cluster: ?0
, al igual que todos los demás documentos que requieran ese comportamiento (ten en cuenta que document.domain
no tiene efecto si solo un documento lo establece).
¿Por qué hacer que document.domain
sea inmutable?
Muchos sitios web configuran document.domain
para permitir la comunicación entre páginas del mismo sitio, pero de origen cruzado.
A continuación, te indicamos cómo usarlo:
Supongamos que una página en https://parent.example.com
incorpora una página de iframe de https://video.example.com
. Estas páginas tienen el mismo eTLD+1 (example.com
) con diferentes subdominios. Cuando el document.domain
de ambas páginas se establece en 'example.com'
, el navegador trata los dos orígenes como si fueran del mismo origen.
Establece el document.domain
para https://parent.example.com
:
// Confirm the current origin of "parent.example.com"
console.log(document.domain);
// Set the document.domain
document.domain = 'example.com';
console.log(document.domain);
Establece el document.domain
para https://video.example.com
:
// Confirm the current origin of "video.example.com"
console.log(document.domain);
// Set the document.domain
document.domain = 'example.com';
console.log(document.domain);
Ahora puedes crear una manipulación de DOM entre orígenes en https://parent.example.com
en https://video.example.com
.
Los sitios web establecen document.domain
para permitir que los documentos del mismo sitio se comuniquen con mayor facilidad. Debido a que este cambio relaja la política del mismo origen, la página superior puede acceder al documento del iframe y recorrer el árbol DOM, y viceversa.
Esta es una técnica conveniente, pero presenta un riesgo de seguridad.
Inquietudes de seguridad con document.domain
Las inquietudes de seguridad en torno a document.domain
provocaron un cambio en la especificación que advierte a los usuarios que eviten usarlo.
La discusión actual con otros proveedores de navegadores se orienta en la misma dirección.
Por ejemplo, cuando dos páginas establecen document.domain
, pueden fingir que tienen el mismo origen. Esto es particularmente importante cuando estas páginas usan un servicio de alojamiento compartido con diferentes subdominios. Configurar document.domain
permite el acceso a todos los demás sitios alojados en ese mismo servicio, lo que facilita a los atacantes acceder a tus sitios. Esto es posible porque document.domain
ignora la parte del número de puerto del dominio.
Para obtener más información sobre las implicaciones de seguridad de configurar document.domain
, lee la página"Document.domain" en MDN.
Chrome planea hacer que document.domain
sea inmutable en Chrome 112.
¿Cómo sé si mi sitio se ve afectado?
Si este cambio afecta a tu sitio web, Chrome mostrará una advertencia en el panel Problemas de Herramientas para desarrolladores. Observa la bandera amarilla en la esquina superior derecha.
Si tienes configurado un extremo de informes, también se te enviarán informes de baja. Obtén más información para usar la API de Reporting con servicios existentes de recopilación de informes o para crear tu propia solución interna.
Puedes ejecutar tu sitio mediante la auditoría de API obsoleta de LightHouse para encontrar todas las APIs que están programadas para quitarse de Chrome.
Comunicación alternativa de origen cruzado
En este momento, tienes tres opciones para reemplazar document.domain
en tu sitio web.
Usa postMessage()
o la API de Channel Messaging
En la mayoría de los casos de uso, postMessage()
o la API de Channel Messaging de origen cruzado pueden reemplazar a document.domain
.
En el siguiente ejemplo:
https://parent.example.com
solicitahttps://video.example.com
dentro de un iframe para manipular el DOM mediante el envío de un mensaje a través depostMessage()
.https://video.example.com
manipula el DOM en cuanto recibe el mensaje y notifica el éxito al elemento superior.https://parent.example.com
confirma el éxito.
En https://parent.example.com
:
// Send a message to https://video.example.com
iframe.postMessage('Request DOM manipulation', 'https://video.example.com');
// Receive messages
iframe.addEventListener('message', (event) => {
// Reject all messages except ones from https://video.example.com
if (event.origin !== 'https://video.example.com') return;
// Filter success messages
if (event.data === 'succeeded') {
// DOM manipulation is succeeded
}
});
En https://video.example.com
:
// Receive messages
window.addEventListener('message', (event) => {
// Reject all messages except ones from https://parent.example.com
if (event.origin !== 'https://parent.example.com') return;
// Do a DOM manipulation on https://video.example.com.
// Send a success message to https://parent.example.com
event.source.postMessage('succeeded', event.origin);
});
Pruébala y comprueba cómo funciona. Si tienes requisitos específicos que no funcionan con postMessage()
o la API de Channel Messaging, comunícate con nosotros en Twitter a través de @ChromiumDev o haz una pregunta en Stack Overflow con una etiqueta document.domain
.
Como último recurso, envía el encabezado Origin-Agent-Cluster: ?0
.
Si tienes motivos sólidos para seguir configurando document.domain
, puedes enviar el encabezado de respuesta Origin-Agent-Cluster: ?0
junto con el documento de destino.
Origin-Agent-Cluster: ?0
El encabezado Origin-Agent-Cluster
indica al navegador si el clúster de agentes con clave de origen debe controlar el documento o no. Para obtener más información sobre Origin-Agent-Cluster
, lee Cómo solicitar aislamiento de rendimiento con el encabezado Origin-Agent-Cluster
.
Cuando envías este encabezado, tu documento puede seguir configurando document.domain
incluso después de que se vuelva inmutable de forma predeterminada.
Configura OriginAgentClusterDefaultEnabled
para la política empresarial
De forma opcional, el administrador puede configurar la política OriginAgentClusterDefaultEnabled
en false
para que document.domain
se pueda configurar de forma predeterminada en las instancias de Chrome de toda la organización. Para obtener más información, consulta Lista y administración de políticas de Chrome Enterprise | Documentación.
Compatibilidad del navegador
- La especificación de Origin indica que se debe quitar la función.
- Mozilla considera inhabilitar
document.domain
de forma predeterminada para crear prototipos. - WebKit indicó que están moderadamente a favor de dar de baja el set de
document.domain
.
Recursos
Document.domain
: APIs web | MDN- Aislamiento de origen y baja
document.domain
- Se dará de baja
document.domain
. · Problema #564 · w3ctag/design-reviews
Agradecimientos
Foto de Braydon Anderson en Unsplash