Se il tuo sito web si basa sull'impostazione di document.domain
, è necessario il tuo intervento.
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 didocument.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.
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:
https://parent.example.com
richiede ahttps://video.example.com
all'interno di un iframe di manipolare il DOM inviando un messaggio tramitepostMessage()
.https://video.example.com
manipola il DOM non appena riceve il messaggio e invia una notifica dell'esito positivo all'elemento padre.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
- La specifica di origine indica che la funzionalità deve essere rimossa.
- Mozilla considera la possibilità di disabilitare
document.domain
per impostazione predefinita, vale la pena prototipare. - WebKit ha indicato di essere moderatamente positivo per il ritiro di
document.domain
setter.
Risorse
Document.domain
- API web | MDN- Isolamento dell'origine e ritiro
document.domain
- Ritiro di
document.domain
. · Numero 564 · w3ctag/design-reviews
Ringraziamenti
Foto di Braydon Anderson su Unsplash