Chrome inhabilitará la modificación de document.domain para que se relaje la política del mismo origen

Si tu sitio web se basa en la configuración de document.domain, debes realizar una acción.

Eiji Kitamura
Eiji Kitamura

Actualizaciones

  • 30 de mayo de 2023: anunciamos que la baja del método set document.domain entrará en vigencia en Chrome 115.
  • 7 de abril de 2023: Identificamos un problema antes de enviar este cambio en Chrome 112. Por el momento, el método set document.domain que se quitará de forma predeterminada está suspendido, y aún no se determinó 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: El método set document.domain se quitará de forma predeterminada a partir de Chrome 112. Además, se agrega una mención sobre la política empresarial para controlar el comportamiento document.domain.
  • 25 de julio de 2022: Cronograma actualizado (el método set 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 Problemas a partir de Chrome 100 y quitaremos el método 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 enfoques alternativos, como postMessage() o la API de Channel Messaging, para comunicar orígenes cruzados. Nuestro objetivo es Chrome 112 para enviar este cambio lo antes posible, pero esto depende de la respuesta a Intent de envío.

Si tu sitio web se basa en la relajación de las políticas de mismo origen a través de document.domain para funcionar correctamente, el sitio deberá enviar un encabezado Origin-Agent-Cluster: ?0, al igual que todos los demás documentos que requieren ese comportamiento (ten en cuenta que document.domain no tiene efecto si solo lo configura un documento).

¿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.

Se usa de la siguiente manera:

Supongamos que una página en https://parent.example.com incorpora una página de iframe desde 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 a 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 del DOM de origen cruzado en https://parent.example.com en https://video.example.com.

Los sitios web configuran document.domain para que los documentos del mismo sitio se comuniquen con mayor facilidad. Debido a que este cambio flexibiliza la política del mismo origen, la página superior puede acceder al documento del iframe y recorrer el árbol del DOM, y viceversa.

Esta es una técnica conveniente, pero presenta un riesgo de seguridad.

Problemas de seguridad con document.domain

Las inquietudes sobre la 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 avanza en la misma dirección.

Por ejemplo, cuando dos páginas establecen el valor document.domain, pueden simular como si fueran del mismo origen. Esto es particularmente importante cuando estas páginas usan un servicio de hosting compartido con diferentes subdominios. Si configuras document.domain, se abrirá el acceso a todos los demás sitios alojados por ese mismo servicio, lo que facilita el acceso de los atacantes a los 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 la configuración de document.domain, consulta la página"Document.domain" en MDN.

Chrome planea hacer que document.domain sea inmutable en Chrome 112.

¿Cómo puedo saber si mi sitio se verá afectado?

Si este cambio afecta tu sitio web, Chrome te mostrará una advertencia en el panel Problemas de Herramientas para desarrolladores. Observa la bandera amarilla en la esquina superior derecha.

Cuando se modifica document.domain, se muestra una advertencia en el panel Problemas.
Cuando se modifica document.domain, se muestra una advertencia en el panel Problemas.

Si tienes configurado un extremo de informes, también se te enviarán informes de baja. Obtén más información sobre cómo usar la API de Reporting con servicios de recopilación de informes existentes o mediante la compilación de 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:

  1. https://parent.example.com solicita https://video.example.com dentro de un iframe para manipular el DOM enviando un mensaje a través de postMessage().
  2. https://video.example.com manipula el DOM en cuanto recibe el mensaje y notifica el éxito al elemento superior.
  3. https://parent.example.com reconoce 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 mira cómo funciona. Si tienes requisitos específicos que no funcionan con postMessage() ni la API de Channel Messaging, avísanos en Twitter a través de @ChromiumDev o 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 continuar 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 manejar el documento o no. Para obtener más información sobre Origin-Agent-Cluster, consulta Solicita 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 manera 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 la organización. Para obtener más información, consulta Administración y lista de políticas de Chrome Enterprise | Documentación.

Compatibilidad del navegador

Recursos

Agradecimientos

Foto de Braydon Anderson en Unsplash