Scopri perché l'isolamento multiorigine è necessario per usare funzionalità avanzate come SharedArrayBuffer
, performance.measureUserAgentSpecificMemory()
e il timer ad alta risoluzione con maggiore precisione.
Introduzione
Nella sezione Rendere il sito web "isolato multiorigine" utilizzando COOP COEP abbiamo spiegato come adottare il modello "cross-origin" isolata" utilizzando COOP e COEP. Questo è un articolo complementare che spiega perché è necessario l'isolamento multiorigine per abilitare funzionalità efficaci nel browser.
Sfondo
Il web è basato sulla stessa origine
: una funzionalità di sicurezza che limita
il modo in cui documenti e script possono interagire con risorse di un'altra origine. Questo
limita i modi in cui i siti web possono accedere alle risorse multiorigine. Per
Ad esempio, a un documento da https://a.example
non è consentito l'accesso ai dati
ospitato presso https://b.example
.
Tuttavia, il criterio della stessa origine presenta alcune eccezioni storiche. Qualsiasi sito web può:
- Incorpora iframe multiorigine
- Includi risorse multiorigine, come immagini o script
- Apri finestre popup multiorigine con un riferimento DOM
Se il web potesse essere progettato da zero, queste eccezioni non esisterebbero. Sfortunatamente, quando la community web ha capito i principali vantaggi di una il criterio della stessa origine, il web si basava già su queste eccezioni.
Gli effetti collaterali sulla sicurezza di una politica permissiva della stessa origine sono stati risolti in due
in molti modi diversi. Un modo è stato l'introduzione di un nuovo protocollo chiamato Cross
Condivisione delle risorse di origine (CORS)
il cui scopo è assicurarsi che il server consenta la condivisione di una risorsa con
una data origine. L'altro modo è rimuovere implicitamente l'accesso diretto allo script
multiorigine, preservando la compatibilità con le versioni precedenti. Tale
Le risorse multiorigine sono chiamate "opache" Google Cloud. Ecco perché, ad esempio,
manipolazione dei pixel di un'immagine multiorigine tramite CanvasRenderingContext2D
non riesce a meno che non venga applicato CORS all'immagine.
Tutte queste decisioni relative ai criteri avvengono all'interno di un gruppo di contesto di navigazione.
Per molto tempo, la combinazione di risorse CORS e opaque è stata sufficiente per browser sicuri. A volte casi limite (come JSON vulnerabilità) e aveva bisogno di una patch, ma nel complesso il principio di non che consentisse l'accesso diretto in lettura ai byte non elaborati delle risorse multiorigine riuscito.
Tutto è cambiato con
Spectre, che
crea tutti i dati caricati nello stesso gruppo di contesti di navigazione del codice
potenzialmente leggibili. Misurando il tempo impiegato da determinate operazioni, gli aggressori
può indovinare i contenuti delle cache della CPU e, di conseguenza, i contenuti dei
processo" la memoria. Tali attacchi a tempo sono possibili con timer a bassa granularità
presenti nella piattaforma, ma che possono essere
accelerati con timer ad alta granularità,
espliciti (ad es. performance.now()
) e impliciti (ad es.
SharedArrayBuffer
). Se evil.com
incorpora un'immagine multiorigine, può utilizzare un'immagine
Spectre per leggere i dati dei pixel, il che fa affidamento sulle protezioni
"opacità" inefficaci.
Idealmente, tutte le richieste multiorigine dovrebbero essere esplicitamente controllate dal server proprietario della risorsa. Se la verifica non è fornita da il server che possiede le risorse, i dati non verranno mai inseriti nella gruppo di contesto di un malvagio aggressore, rimanendo così fuori dalla portata di Spettro attacchi che una pagina web potrebbe effettuare. Viene chiamato stato isolato multiorigine. Questo è esattamente lo scopo di COOP+COEP.
In uno stato di isolamento multiorigine, il sito richiedente è considerato meno indicato
pericoloso, che sblocca funzionalità potenti come SharedArrayBuffer
,
performance.measureUserAgentSpecificMemory()
e alta risoluzione
automaticamente con maggiore precisione, il che potrebbe
altrimenti usato per attacchi simili a Spectre. Inoltre, impedisce di modificare
document.domain
.
Criterio di incorporamento multiorigine
Incorporatore multiorigine (COEP) impedisce che di non caricare risorse multiorigine che non concedono in modo esplicito l'autorizzazione di accesso ai documenti (utilizzando CORP o CORS). Con questa funzione, puoi dichiarare impossibile caricare queste risorse da un documento.
Per attivare questo criterio, aggiungi la seguente intestazione HTTP al documento:
Cross-Origin-Embedder-Policy: require-corp
La parola chiave require-corp
è l'unico valore accettato per il COEP. Questa operazione applica
il criterio secondo cui il documento può caricare risorse solo dalla stessa origine oppure
di risorse contrassegnate esplicitamente come caricabili da un'altra origine.
Affinché le risorse possano essere caricate da un'altra origine, devono supportare Condivisione delle risorse tra origini (CORS) o criteri delle risorse tra origini (CORP).
Condivisione delle risorse tra origini
Se una risorsa multiorigine supporta la condivisione delle risorse tra origini
(CORS), puoi utilizzare
crossorigin
:
attributo
per caricarlo sulla tua pagina web senza essere bloccato dal COEP.
<img src="https://third-party.example.com/image.jpg" crossorigin>
Ad esempio, se questa risorsa immagine viene fornita con intestazioni CORS, utilizza la classe
crossorigin
in modo che la richiesta di recupero della risorsa utilizzi CORS
predefinita. Anche questo
impedisce il caricamento dell'immagine a meno che non vengano impostate intestazioni CORS.
Allo stesso modo, puoi recuperare dati multiorigine tramite il metodo fetch()
, che
non richiede una gestione speciale purché il server risponda con il giusto
HTTP
intestazioni.
Criterio delle risorse tra origini
Criteri delle risorse tra origini (CORP) è stato originariamente introdotto come opzione di attivazione per impedire che le risorse caricato da un'altra origine. Nel contesto del COEP, CORP può specificare la risorsa il criterio del proprietario per specificare chi può caricare una risorsa.
L'intestazione Cross-Origin-Resource-Policy
accetta tre valori possibili:
Cross-Origin-Resource-Policy: same-site
Le risorse contrassegnate con same-site
possono essere caricate solo dallo stesso sito.
Cross-Origin-Resource-Policy: same-origin
Le risorse contrassegnate con same-origin
possono essere caricate solo dalla stessa origine.
Cross-Origin-Resource-Policy: cross-origin
Le risorse contrassegnate come cross-origin
possono essere caricate da qualsiasi sito web. (Questo
predefinito è stato aggiunto
specifica CORP insieme a COEP.)
Criterio di apertura multiorigine
Criterio di apertura multiorigine
(COOP) ti consente di assicurarti
che una finestra di primo livello viene isolata dagli altri documenti inserendoli in una
gruppo di contesti di navigazione diverso, in modo che non possano interagire direttamente
finestra di primo livello. Ad esempio, se un documento contenente COOP apre un popup,
La proprietà window.opener
verrà null
. Inoltre, la proprietà .closed
del metodo
il riferimento di apertura a quest'ultimo restituirà true
.
L'intestazione Cross-Origin-Opener-Policy
accetta tre valori possibili:
Cross-Origin-Opener-Policy: same-origin
I documenti contrassegnati con same-origin
possono condividere lo stesso contesto di navigazione
gruppo con documenti della stessa origine contrassegnati in modo esplicito come same-origin
.
Cross-Origin-Opener-Policy: same-origin-allow-popups
Un documento di primo livello con same-origin-allow-popups
conserva i riferimenti a qualsiasi
dei popup che non impostano COOP o che disattivano l'isolamento
l'impostazione di un COOP di unsafe-none
.
Cross-Origin-Opener-Policy: unsafe-none
unsafe-none
è l'impostazione predefinita e consente di aggiungere il documento a quello di apertura
navigazione del gruppo di contesti, a meno che l'apertura stessa non abbia una COOP di same-origin
.
Riepilogo
Se vuoi avere accesso garantito a funzionalità avanzate come SharedArrayBuffer
,
performance.measureUserAgentSpecificMemory()
o alta risoluzione
i timer con maggiore precisione, ricorda
che il documento deve utilizzare sia COEP con valore require-corp
che
COOP con il valore di same-origin
. In assenza di entrambe le opzioni, il browser
non garantire un isolamento sufficiente per attivare in sicurezza queste potenti funzionalità. Tu
puoi stabilire la situazione della tua pagina controllando se
self.crossOriginIsolated
restituisce true
.
Per scoprire i passaggi per implementarla, vedi Rendere il sito web "multiorigine" isolata" utilizzando COOP e COEP.