Dowiedz się, dlaczego izolacja zasobów z innych domen jest potrzebna do bardziej precyzyjnego korzystania z zaawansowanych funkcji, takich jak SharedArrayBuffer
, performance.measureUserAgentSpecificMemory()
i licznik czasu w wysokiej rozdzielczości.
Wprowadzenie
W sekcji Ustawianie witryny jako izolowanej od zasobów z innych domen” korzystając z COOP, COEP wyjaśniliśmy, jak wdrożyć integrację „między domenami”. izolowane" za pomocą COOP i COEP. To jest artykuł towarzyszący, który wyjaśnia, Dlaczego do włączenia zaawansowanych funkcji w przeglądarce wymagana jest izolacja zasobów z innych domen.
Tło
Internet jest oparty na tym samym pochodzeniu
zasady: funkcja zabezpieczeń, która ogranicza
jak dokumenty i skrypty mogą wchodzić w interakcję z zasobami z innego źródła. Ten
ogranicza sposoby uzyskiwania przez strony dostępu do zasobów z innych domen. Dla:
na przykład dokument z https://a.example
nie ma dostępu do danych
na serwerze https://b.example
.
Jednak w przypadku zasady tego samego pochodzenia występowały pewne wyjątki w przeszłości. Każda witryna może:
- Umieszczanie elementów iframe z innych domen
- Uwzględnianie zasobów z innych domen, takich jak obrazy lub skrypty
- Otwieraj wyskakujące okienka z innych domen z odniesieniem do DOM
Gdyby sieć mogła zostać zaprojektowana od podstaw, nie byłoby takich wyjątków. Niestety, zanim członkowie społeczności internetowej zdali sobie sprawę z zalet korzystania rygorystycznej zasady tego samego pochodzenia, internet opierał się już na tych wyjątkach.
Efekty uboczne takiej niezbyt luźnej zasady dotyczącej tego samego pochodzenia zostały poprawione w 2 elementach:
kilka sposobów. Jednym ze sposobów było wprowadzenie nowego protokołu o nazwie cross
punktowe udostępnianie zasobów (CORS)
zagwarantuje, że serwer pozwala udostępniać zasoby
danego punktu początkowego. Innym sposobem jest niejawne usunięcie bezpośredniego dostępu do skryptu
zasobów z innych domen przy zachowaniu zgodności wstecznej. Taka
zasoby z innych domen są nazywane „nieprzejrzystymi” i zasobami Google Cloud. Dlatego właśnie dlatego
manipulowanie pikselami obrazu z innej domeny za pomocą narzędzia CanvasRenderingContext2D
kończy się niepowodzeniem, chyba że do obrazu zostanie zastosowany CORS.
Wszystkie te decyzje dotyczące zasad są podejmowane w ramach grupy kontekstu przeglądania.
Przez długi czas połączenie CORS i nieprzezroczystych zasobów wystarczało bezpieczeństwa w przeglądarkach. Czasami skrajne przypadki (takie jak JSON luki w zabezpieczeniach) i trzeba je poprawić, ale ogólna zasada: zezwalanie na bezpośredni dostęp z możliwością odczytu do nieprzetworzonych bajtów zasobów z innych domen było udało się.
Wszystko zmieniło się dzięki
Spectre, czyli
tworzy wszystkie dane, które są wczytywane do tej samej grupy kontekstu przeglądania co Twój kod
czytelna. Mierząc czas potrzebny na wykonanie pewnych działań, atakujący
może odgadnąć zawartość pamięci podręcznych procesora, dzięki czemu można
proces pamięci. Takie ataki czasowe są możliwe w przypadku liczników czasu o niskiej szczegółowości
dostępnych na platformie, ale można je przyspieszyć za pomocą bardzo szczegółowych liczników czasu,
jawne (jak performance.now()
) i niejawne (np.
SharedArrayBuffer
). Jeśli evil.com
umieszcza obraz z innej domeny, może użyć tagu
Atak Spectre odczytuje dane z pikseli, co sprawia, że zabezpieczenia polegają na
„nieprzezroczystość” nieskuteczne.
W idealnej sytuacji wszystkie żądania z innych domen powinny być wyraźnie sprawdzone przez serwer do których należy zasób. Jeśli firma nie zapewnia weryfikacji serwera będącego właścicielem zasobów, dane nigdy nie trafią do przeglądarki w kontekście grupy kontekstu złego aktora, przez co nie będzie dostępna w zasięgu żadnej grupy Spectre które może przeprowadzić strona internetowa. Nazywamy to stanem izolowanym od zasobów z innych domen. Na tym właśnie polega COOP+COEP.
W stanie izolacji od zasobów z innych domen witryna wysyłająca żądanie jest uznawana za mniej
niebezpieczne, co pozwala odblokować zaawansowane funkcje, takie jak SharedArrayBuffer
,
performance.measureUserAgentSpecificMemory()
i w wysokiej rozdzielczości
z większą precyzją,
którą można by wykorzystać
do ataków typu Spectre. Zapobiega też
document.domain
Zasady dotyczące umieszczania treści z różnych domen
Umieszczanie między Origin Policy (COEP) uniemożliwia dokument przed wczytaniem wszystkich zasobów z innych domen, które nie przyznają dostępu w sposób jednoznaczny uprawnienia do dokumentu (przy użyciu CORP lub CORS). Dzięki tej funkcji możesz zadeklarować, że dokument nie może wczytać takich zasobów.
Aby aktywować tę zasadę, dołącz do dokumentu następujący nagłówek HTTP:
Cross-Origin-Embedder-Policy: require-corp
Jedyną akceptowaną wartością kosztu własnego sprzedaży jest słowo kluczowe require-corp
. To wymusza
zasada, zgodnie z którą dokument może ładować zasoby tylko z tego samego źródła;
zasoby wyraźnie oznaczone jako możliwe do wczytania z innego źródła.
Aby zasoby mogły być wczytywane z innego źródła, muszą obsługiwać: Zasady dotyczące zasobów między serwerami z różnych domen (CORS) lub CORP.
Udostępnianie zasobów między serwerami z różnych domen
Jeśli zasób z innego źródła obsługuje udostępnianie zasobów z innych domen
(CORS), możesz użyć funkcji
crossorigin
, aby wczytać go na Twoją stronę internetową bez blokowania przez COEP.
<img src="https://third-party.example.com/image.jpg" crossorigin>
Jeśli na przykład ten zasób graficzny jest obsługiwany z nagłówkami CORS, użyj metody
crossorigin
, tak aby żądanie pobrania zasobu używało CORS
i trybu. To także
uniemożliwia załadowanie obrazu, chyba że ustawi nagłówki CORS.
Możesz też pobierać dane z różnych domen za pomocą metody fetch()
, która
nie wymaga specjalnej obsługi, jeśli tylko serwer odpowiada z prawem
HTTP
nagłówki.
Zasady dotyczące zasobów dla różnych źródeł
Zasady dotyczące zasobów z innych domen (CORP) została pierwotnie wprowadzona w celu ochrony Twoich zasobów przed wczytany przez inny punkt początkowy. W kontekście COEP CORP może określić zasób zasady właściciela określające, kto może wczytywać zasób.
Nagłówek Cross-Origin-Resource-Policy
może przyjmować 3 możliwe wartości:
Cross-Origin-Resource-Policy: same-site
Zasoby oznaczone jako same-site
mogą być ładowane tylko z tej samej witryny.
Cross-Origin-Resource-Policy: same-origin
Zasoby oznaczone jako same-origin
mogą być ładowane tylko z tego samego źródła.
Cross-Origin-Resource-Policy: cross-origin
Zasoby oznaczone jako cross-origin
mogą być wczytywane przez dowolną witrynę. (Ten
wartość została dodana do
specyfikacji CORP i COEP).
Zasada otwierająca z różnych domen
Zasady otwierające z różnych domen
(COOP) pozwala zapewnić,
że okno najwyższego poziomu jest odizolowane od innych dokumentów, umieszczając je w
inną grupę kontekstu przeglądania, tak aby nie mogli wchodzić w bezpośrednią interakcję
okna najwyższego poziomu. Jeśli na przykład w dokumencie z właścicielem treści otworzy się wyskakujące okienko,
Właściwość window.opener
zmieni się na null
. Ponadto właściwość .closed
atrybutu
odwołanie do niego spowoduje zwrócenie true
.
Nagłówek Cross-Origin-Opener-Policy
może przyjmować 3 możliwe wartości:
Cross-Origin-Opener-Policy: same-origin
Dokumenty oznaczone jako same-origin
mogą współdzielić ten sam kontekst przeglądania
z dokumentami tego samego pochodzenia, które są też wyraźnie oznaczone jako same-origin
.
Cross-Origin-Opener-Policy: same-origin-allow-popups
Dokument najwyższego poziomu z atrybutem same-origin-allow-popups
przechowuje odniesienia do
wyskakujących okienek, które nie ustawiają kosztu działalności lub rezygnują z izolacji
Ustawienie działalności biznesowej w wysokości unsafe-none
.
Cross-Origin-Opener-Policy: unsafe-none
unsafe-none
jest domyślną opcją i umożliwia dodanie dokumentu do menu otwierającego
przeglądanie grupy kontekstu, chyba że osoba otwierająca ma zasób COOP w wysokości same-origin
.
Podsumowanie
Jeśli chcesz mieć gwarantowany dostęp do zaawansowanych funkcji, takich jak SharedArrayBuffer
,
performance.measureUserAgentSpecificMemory()
lub w wysokiej rozdzielczości
minutniki z większą precyzją. Pamiętaj
że dokument musi używać zarówno COEP o wartości require-corp
, jak i
COOP o wartości same-origin
. W przypadku braku któregokolwiek z tych ustawień przeglądarka
nie gwarantuje wystarczającej izolacji, aby można było bezpiecznie włączyć te zaawansowane funkcje. Ty
mogą określić sytuację strony, sprawdzając, czy
self.crossOriginIsolated
zwraca true
.
Instrukcje wdrażania znajdziesz w artykule Tworzenie witryny „między domenami”. izolowane" korzystając z COOP i COEP.