Als uw website afhankelijk is van het instellen van document.domain, is uw actie vereist.
Wat verandert er, en waarom?
Vanaf Chrome 115 kunnen websites document.domain
niet meer instellen: Chrome maakt document.domain
onveranderlijk. Om cross-origineel te communiceren, moet je alternatieve benaderingen gebruiken, zoals postMessage()
of de Channel Messaging API.
Houd er rekening mee dat deze wijziging geleidelijk wordt uitgerold.
We verwachten dat andere browsers deze functionaliteit uiteindelijk zullen beëindigen en verwijderen. Bekijk het gedeelte over browsercompatibiliteit voor meer informatie.
Waarom document.domain
onveranderlijk maken?
document.domain
is ontworpen om de hostnaam van de oorsprong op te halen of in te stellen. Veel websites stellen document.domain
in om communicatie tussen pagina's van dezelfde site, maar cross-origineel, mogelijk te maken.
Hoewel dit een handige techniek is, brengt het een veiligheidsrisico met zich mee, omdat het het beleid inzake dezelfde oorsprong versoepelt . Beveiligingsproblemen rond document.domain
hebben geleid tot een wijziging in de specificatie die gebruikers waarschuwt het gebruik ervan te vermijden .
In detail: Waarom document.domain onveranderlijk maken?
Hoe document.domain
tegenwoordig wordt gebruikt
Veel websites stellen document.domain
in om communicatie tussen pagina's van dezelfde site, maar cross-origineel, mogelijk te maken.
Dezelfde site maar cross-origin sites hebben dezelfde eTLD+1 maar verschillende subdomeinen.
Hier ziet u hoe document.domain
tot nu toe werd gebruikt:
Stel dat een pagina op https://parent.example.com
een iframe-pagina van https://video.example.com
insluit. Deze pagina's hebben dezelfde eTLD+1 ( example.com
) met verschillende subdomeinen. Wanneer document.domain
van beide pagina's is ingesteld op 'example.com'
, behandelt de browser de twee oorsprongen alsof ze dezelfde oorsprong hebben.
Stel het document.domain
in voor 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);
Stel het document.domain
in voor 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);
U kunt nu een cross-origin DOM-manipulatie maken op https://parent.example.com
tegen https://video.example.com
.
Websites hebben document.domain
ingesteld om het mogelijk te maken dat documenten op dezelfde site gemakkelijker kunnen communiceren. Omdat deze wijziging het same-origin-beleid versoepelt , heeft de bovenliggende pagina toegang tot het iframe-document en kan de DOM-structuur worden doorkruist, en omgekeerd.
Dit is een handige techniek, maar brengt wel een veiligheidsrisico met zich mee.
Beveiligingsproblemen met document.domain
Beveiligingsproblemen rond document.domain
hebben geleid tot een wijziging in de specificatie die gebruikers waarschuwt het gebruik ervan te vermijden .
Wanneer twee pagina's bijvoorbeeld document.domain
instellen, kunnen ze doen alsof ze dezelfde oorsprong hebben. Dit is vooral van cruciaal belang wanneer deze pagina's een gedeelde hostingservice met verschillende subdomeinen gebruiken. Als u document.domain
instelt, krijgt u toegang tot alle andere sites die door dezelfde service worden gehost, waardoor aanvallers gemakkelijker toegang krijgen tot uw sites. Dit is mogelijk omdat document.domain
het poortnummergedeelte van het domein negeert.
Voor meer informatie over de beveiligingsimplicaties van het instellen van document.domain
leest u de pagina "Document.domain" op MDN .
Browsercompatibiliteit
- In de HTML-specificatie staat dat de functie moet worden verwijderd.
- Mozilla acht het standaard uitschakelen van
document.domain
de moeite waard om prototypes van te maken . - WebKit gaf aan dat ze gematigd positief zijn over het afschaffen van
document.domain
setter . - Discussie met andere browserleveranciers
- WHATWG / HTML-werkgroep Pull Request (in afwachting van experimenteerervaring)
Hoe weet ik of mijn site getroffen is?
Als uw website door deze wijziging wordt getroffen, waarschuwt Chrome u in het paneel DevTools Issues. Deze waarschuwing is in 2022 toegevoegd. Let op de gele vlag rechtsboven in DevTools.
U kunt uw site ook door de beëindigde API-audit van LightHouse laten lopen om alle API's te vinden die volgens de planning uit Chrome zullen worden verwijderd.
Als u de Reporting API heeft ingesteld, heeft Chrome u beëindigingsrapporten gestuurd om u op de hoogte te stellen van deze aanstaande beëindiging. Lees meer over hoe u de Reporting API kunt gebruiken met bestaande diensten voor rapportverzameling of door uw eigen interne oplossing te bouwen.
Hoe kan ik deze verandering in actie zien?
De wijziging wordt geleidelijk uitgerold, te beginnen in Chrome 115 . Als u wilt zien hoe deze wijziging in werking treedt, zelfs als deze nog niet in uw Chrome-browser is uitgerold, kunt u deze als volgt inschakelen:
- Open
chrome://flags/#origin-agent-cluster-default
- Selecteer Inschakelen.
- Start Chrome opnieuw.
Welke alternatieven kan ik gebruiken?
De beste optie is om document.domain
helemaal niet te wijzigen, bijvoorbeeld door de pagina en alle samenstellende frames op dezelfde oorsprong te hosten. Dit werkt in alle versies van alle browsers. Maar hiervoor kan een aanzienlijke herbewerking van een applicatie nodig zijn, dus het is de moeite waard om ook naar alternatieven te kijken die cross-origin-toegang blijven ondersteunen.
Gebruik postMessage()
of Channel Messaging API in plaats van document.domain
In de meeste gebruiksgevallen kan de cross-origin postMessage()
of Channel Messaging API document.domain
vervangen.
In het volgende voorbeeld:
-
https://parent.example.com
verzoekthttps://video.example.com
binnen een iframe om DOM te manipuleren door een bericht te verzenden viapostMessage()
. -
https://video.example.com
manipuleert DOM zodra het het bericht ontvangt en meldt het succes terug aan de ouder. -
https://parent.example.com
erkent het succes.
Op 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
}
});
Op 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);
});
Probeer het en kijk hoe het werkt. Als je specifieke vereisten hebt die niet werken met postMessage()
of Channel Messaging API, laat het ons dan weten op Twitter via @ChromiumDev of vraag het op Stack Overflow met een document.domain
-tag .
Als laatste redmiddel kunt u de header Origin-Agent-Cluster: ?0
verzenden
Als u goede redenen heeft om door te gaan met het instellen van document.domain
, kunt u de responsheader Origin-Agent-Cluster: ?0
samen met het doeldocument verzenden.
Origin-Agent-Cluster: ?0
De Origin-Agent-Cluster
header instrueert de browser of het document moet worden afgehandeld door het agentcluster met oorsprongssleutel of niet. Voor meer informatie over Origin-Agent-Cluster
leest u Prestatie-isolatie aanvragen met de Origin-Agent-Cluster
header .
Wanneer u deze header verzendt, kan uw document document.domain
blijven instellen, zelfs nadat het standaard onveranderlijk is geworden.
Alle andere documenten die dit gedrag vereisen, moeten ook een Origin-Agent-Cluster
verzenden (merk op dat document.domain
geen effect heeft als slechts één document dit instelt).
Configureer OriginAgentClusterDefaultEnabled
voor ondernemingsbeleid
Optioneel kan uw beheerder het beleid OriginAgentClusterDefaultEnabled
configureren op false
zodat document.domain
standaard kan worden ingesteld op Chrome-instanties in uw organisatie. Lees Chrome Enterprise-beleidslijst en -beheer | voor meer informatie Documentatie .
Bronnen
-
Document.domain
- Web-API's | MDN - Isolatie van oorsprong en beëindiging van
document.domain
-
document.domain
wordt beëindigd. · Uitgave #564 · w3ctag/design-reviews
Dankbetuigingen
Foto door Finan Akbar op Unsplash