Chrome disattiverà la modifica del file document.domain per allentare il criterio della stessa origine

Se il tuo sito web si basa sull'impostazione di document.domain, è necessario il tuo intervento.

Eiji Kitamura
Eiji Kitamura

regolari

  • 30 maggio 2023: abbiamo annunciato che il ritiro del setter document.domain diventerà effettivo in Chrome 115.
  • 7 aprile 2023: abbiamo identificato un problema prima di inviare questa modifica in Chrome 112. Il setter document.domain da rimuovere per impostazione predefinita è attualmente sospeso e il nuovo traguardo relativo alla spedizione non è ancora stato determinato. Torna a controllare questo post del blog o iscriviti a blink-dev e a questo thread.
  • 20 gennaio 2023: cronologia aggiornata: il setter document.domain verrà rimosso per impostazione predefinita a partire da Chrome 112. Inoltre, viene aggiunta una menzione ai criteri aziendali per controllare il comportamento di document.domain.
  • 25 luglio 2022: aggiornamento della sequenza temporale: il setter document.domain verrà rimosso per impostazione predefinita a partire da Chrome 109.
  • 4 febbraio 2022: aggiornamento in base alla nuova sequenza temporale. Nel riquadro Problemi verrà mostrato un avviso a partire da Chrome 100, con la rimozione del setter document.domain per impostazione predefinita a partire da Chrome 106.

document.domain è stato progettato per ottenere o impostare il nome host dell'origine.

Su Chrome non sarà possibile impostare document.domain per i siti web. Dovrai utilizzare approcci alternativi, come postMessage() o l'API Channel Messaging per comunicare tra origini. Abbiamo scelto di inviare questa modifica a Chrome 112 il prima possibile, ma questa funzionalità dipende dalla risposta all'intent to Ship.

Se il tuo sito web si basa sull'allentamento dei criteri della stessa origine tramite document.domain per funzionare correttamente, il sito dovrà inviare un'intestazione Origin-Agent-Cluster: ?0, così come tutti gli altri documenti che richiedono questo comportamento (tieni presente che document.domain non ha alcun effetto se viene impostato da un solo documento).

Perché rendere document.domain immutabile?

Molti siti web impostano il criterio document.domain per consentire la comunicazione tra pagine stesso sito ma multiorigine.

Ecco come si usa:

Supponiamo che una pagina su https://parent.example.com incorpora una pagina iframe da https://video.example.com. Queste pagine hanno lo stesso eTLD+1 (example.com) con sottodomini diversi. Quando l'elemento document.domain di entrambe le pagine è impostato su 'example.com', il browser tratta le due origini come se avessero la stessa origine.

Imposta document.domain per 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);

Imposta document.domain per 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);

Ora puoi creare una manipolazione del DOM multiorigine su https://parent.example.com rispetto a https://video.example.com.

I siti web hanno impostato document.domain in modo da rendere più semplice la comunicazione tra i documenti dello stesso sito. Poiché questa modifica allenta il criterio della stessa origine, la pagina principale è in grado di accedere al documento dell'iframe e attraversare la struttura DOM e viceversa.

Si tratta di una tecnica pratica, ma comporta un rischio per la sicurezza.

Problemi di sicurezza relativi a document.domain

I problemi di sicurezza relativi a document.domain hanno portato a una modifica della specifica che avvisa gli utenti di non utilizzarla. La discussione attuale con altri fornitori di browser si sta muovendo nella stessa direzione.

Ad esempio, quando due pagine impostano document.domain, possono far finta che abbiano la stessa origine. Ciò è particolarmente importante quando queste pagine usano un servizio di hosting condiviso con sottodomini diversi. La configurazione di document.domain apre l'accesso a tutti gli altri siti ospitati da quello stesso servizio, in modo che gli utenti malintenzionati possano accedere più facilmente ai tuoi siti. Questo è possibile perché document.domain ignora la parte del numero di porta del dominio.

Per scoprire di più sulle implicazioni sulla sicurezza dell'impostazione di document.domain, consulta la pagina "Document.domain" su MDN.

Chrome prevede di rendere immutabile document.domain in Chrome 112.

Come faccio a sapere se il mio sito è interessato?

Se il tuo sito web è interessato da questa modifica, Chrome visualizza un avviso nel riquadro Problemi di DevTools. Nota la bandiera gialla nell'angolo in alto a destra.

Quando document.domain viene modificato, viene visualizzato un avviso nel riquadro Problemi.
Quando document.domain viene modificato, viene visualizzato un avviso nel riquadro Problemi.

Se hai configurato un endpoint di reporting, ti verranno inviati anche i report sul ritiro. Scopri di più su come utilizzare l'API di reporting con i servizi di raccolta report esistenti o creando la tua soluzione interna.

Puoi sottoporre il tuo sito al controllo delle API ritirate da LightHouse per trovare tutte le API di cui è prevista la rimozione da Chrome.

Comunicazione multiorigine alternativa

Al momento, hai tre opzioni per sostituire document.domain per il tuo sito web.

Utilizza postMessage() o l'API Channel Messaging

Nella maggior parte dei casi d'uso, l'postMessage() o API Channel Messaging può sostituire document.domain.

Nel seguente esempio:

  1. https://parent.example.com richiede a https://video.example.com all'interno di un iframe di manipolare il DOM inviando un messaggio tramite postMessage().
  2. https://video.example.com manipola il DOM non appena riceve il messaggio e invia una notifica dell'esito positivo all'elemento padre.
  3. https://parent.example.com conferma l'esito positivo.

Il giorno 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
  }
});

Il giorno 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);
});

Provala e scopri come funziona. Se hai requisiti specifici che non funzionano con postMessage() o con l'API Channel Messaging, contattaci su Twitter tramite @ChromiumDev o chiedi su Stack Overflow usando un tag document.domain.

Come ultima alternativa, invia l'intestazione Origin-Agent-Cluster: ?0

Se hai motivi validi per continuare a impostare document.domain, puoi inviare l'intestazione della risposta Origin-Agent-Cluster: ?0 insieme al documento di destinazione.

Origin-Agent-Cluster: ?0

L'intestazione Origin-Agent-Cluster indica al browser se il documento deve essere gestito o meno dal cluster di agenti in base all'origine. Per scoprire di più su Origin-Agent-Cluster, consulta Richiedere l'isolamento delle prestazioni con l'intestazione Origin-Agent-Cluster.

Quando invii questa intestazione, il documento può continuare a impostare document.domain anche se diventa immutabile per impostazione predefinita.

Configura il criterio OriginAgentClusterDefaultEnabled per le aziende

Facoltativamente, l'amministratore può configurare il criterio OriginAgentClusterDefaultEnabled su false per rendere document.domain configurabile per impostazione predefinita sulle istanze di Chrome nella tua organizzazione. Per ulteriori informazioni, vedi Elenco e gestione dei criteri di Chrome Enterprise | Documentazione.

Compatibilità del browser

Risorse

Ringraziamenti

Foto di Braydon Anderson su Unsplash