Dlaczego zaawansowane funkcje są potrzebne do obsługi zasobów z innych domen

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.

Grupa kontekstowa 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.

Widmo

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.

Jak działa model COEP

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.

COOP

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.

COOP

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.

COOP

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.

Zasoby