Dostępna jest nowa wersja interfejsu Reporting API. Zapewnia większą prywatność i jest bardziej prawdopodobne, że będzie obsługiwany w różnych przeglądarkach.
Interfejs Reporting API informuje o błędach występujących w Twojej witrynie podczas jej użytkowania przez użytkowników. Dzięki niemu możesz sprawdzać interwencje przeglądarki, jej awarie, naruszenia zasad Content Security Policy, naruszenia zasad COOP/COEP, ostrzeżenia o wycofaniu i inne.
Dostępna jest nowa wersja interfejsu Reporting API. Nowy interfejs API jest bardziej zwięzły i bardziej prawdopodobne, że będzie obsługiwany w różnych przeglądarkach.
Podsumowanie
Deweloperzy witryn
Jeśli masz już w swojej witrynie funkcję raportowania: przejdź na wersję 1, używając nowego nagłówka (Reporting-Endpoints
), ale przez jakiś czas zachowaj stary nagłówek (Report-To
). Zobacz Przejście na wersję 1: przykładowy kod.
Jeśli dopiero teraz dodajesz do swojej witryny funkcję raportowania: użyj tylko nowego nagłówka (Reporting-Endpoints
).
⚠️ W obu przypadkach pamiętaj, aby ustawić nagłówek Reporting-Endpoints
we wszystkich odpowiedziach, które mogą generować raporty.
Deweloperzy usług raportowania
Jeśli zarządzasz usługą punktu końcowego lub korzystasz z własnej, spodziewaj się większego ruchu, gdy Ty lub zewnętrzni deweloperzy przejdziecie na interfejs Reporting API w wersji 1 (nagłówek Reporting-Endpoints
).
Czytaj dalej, aby dowiedzieć się więcej i poznać przykładowy kod.
Rejestrowanie błędów sieci
Zostanie opracowany nowy mechanizm rejestrowania błędów sieci. Gdy to nastąpi, przejdź z interfejsu Reporting API w wersji 0 na nowy mechanizm.
Wersja demonstracyjna i kod
- Witryna demonstracyjna: nowy interfejs Reporting API (wersja 1)
- Kod witryny demonstracyjnej
Różnice między wersjami 0 i 1
Co się zmienia
- Interfejs API jest inny.
Report-To: { group: "main-endpoint", "max_age": 86400, "endpoints": [ { "url": ... }, { "url": ... }] }, { group: "default-endpoint", "max_age": 86400, "endpoints": [ { "url": ... }, { "url": ... }] } Document-Policy: ...; report-to main-endpoint
{0} używa nagłówka Report-To
do konfigurowania nazwanych grup punktów końcowych, a w innych nagłówkach dyrektywy report-to
do odwoływania się do tych grup.
Reporting-Endpoints: main-endpoint="https://reports.example/main", default="https://reports.example/default" Document-Policy: ...; report-to main-endpoint
Wersja 1 używa nagłówka Reporting-Endpoints
do konfigurowania nazwanych punktów końcowych. Podobnie jak w wersji 0, w innych nagłówkach używa ona dyrektywy report-to
, aby odwoływać się do tych grup punktów końcowych.
- Zakres raportu jest inny.
W wersji 0 możesz skonfigurować punkty końcowe raportowania tylko w przypadku niektórych odpowiedzi. Inne dokumenty (strony) w tym źródle będą automatycznie używać tych punktów końcowych.
W wersji 1 musisz ustawić nagłówek Reporting-Endpoints
we wszystkich odpowiedziach, które mogą generować raporty.
- Oba interfejsy API obsługują te same typy raportów z jednym wyjątkiem: wersja 1 nie obsługuje raportów o błędach sieciowych. Więcej informacji znajdziesz w instrukcji migracji.
- Wersja 0 nie jest i nie będzie obsługiwana we wszystkich przeglądarkach. W przyszłości prawdopodobnie będziemy obsługiwać wersję 1.
Co pozostaje bez zmian
- Format i struktura raportów nie uległy zmianie.
- Żądanie wysłane przez przeglądarkę do punktu końcowego pozostaje żądaniem
POST
o wartościContent-type
application/reports+json
. - Mapowanie niektórych punktów końcowych na określone typy raportów jest obsługiwane zarówno w wersji 0, jak i w wersji 1.
- Rola punktu końcowego
default
pozostaje niezmieniona. Interfejs API do raportowania w wersji 1 nie ma wpływu na
ReportingObserver
. UżytkownikReportingObserver
nadal ma dostęp do wszystkich raportów obserwowalnych, a ich format jest identyczny.
Wszystkie różnice między wersjami 0 i 1
Starszy interfejs Reporting API (w wersji 0)Report-To nagłówek |
Nowy interfejs API do raportowania (wersja 1)Reporting-Endpoints nagłówek |
|
---|---|---|
Obsługa przeglądarek | Chrome 69 lub nowszy oraz Edge 69 lub nowszy. | Chrome 96 lub nowszy oraz Edge 96 lub nowszy. Firefox jest obsługiwany. Safari nie ma nic przeciwko temu. Zobacz sygnały przeglądarki. |
Punkty końcowe | Wysyła raporty do dowolnego z wielu zbieraczy raportów (wiele adresów URL zdefiniowanych na grupę punktów końcowych). | Wysyła raporty do określonych zbieraczy raportów (na każdy punkt końcowy można zdefiniować tylko 1 adres URL). |
Interfejs API | Używa nagłówka `Report-To` do konfigurowania nazwanych grup punktów końcowych. |
Używa nagłówka `Reporting-Endpoints` do konfigurowania nazwanych punktów końcowych. |
Typy raportów, które można wygenerować za pomocą tego interfejsu API |
|
Nie zmienione, z wyjątkiem logowania błędów sieci (NEL): ta funkcja nie jest obsługiwana w nowym interfejsie Reporting API (w wersji 1). |
Zakres raportu | pochodzenia. Nagłówek Report-To dokumentu wpływa na inne dokumenty (strony) z tego źródła.
Pole url w raporcie nadal różni się w zależności od dokumentu.
|
Dokument. Nagłówek Reporting-Endpoints dokumentu ma zastosowanie tylko do tego dokumentu.
Pole url w raporcie nadal różni się w zależności od dokumentu.
|
Izolowanie raportów (zbiorczo) | Różne dokumenty (strony) lub witryny/źródła, które generują raport mniej więcej w tym samym czasie i mają ten sam punkt końcowy raportowania, zostaną zgrupowane razem: zostaną wysłane w tym samym komunikacie do punktu końcowego raportowania. |
|
Obsługa równoważenia obciążenia / priorytetów | Tak | Nie |
Deweloperzy punktów końcowych: spodziewajcie się większego ruchu
Jeśli masz skonfigurowany własny serwer jako punkt końcowy raportowania lub tworzysz lub utrzymujesz usługę zbierania raportów, spodziewaj się większego ruchu na tym punkcie końcowym.
Wynika to z tego, że w interfejsie Reporting API w wersji 1 raporty nie są grupowane, jak w interfejsie Reporting API w wersji 0. Gdy deweloperzy aplikacji zaczną przechodzić na interfejs Reporting API w wersji 1, liczba raportów pozostanie podobna, ale objętość żądań do serwera punktu końcowego wzrośnie.
Deweloperzy aplikacji: migracja do Reporting-Endpoints
(wersja 1)
Co musisz zrobić?
Korzystanie z nowego interfejsu Reporting API (w wersji 1) niesie ze sobą kilka korzyści: ✅
- Sygnały z przeglądarki są dodatnie, co oznacza, że można oczekiwać obsługi wersji 1 w różnych przeglądarkach (w przeciwieństwie do wersji 0, która jest obsługiwana tylko w Chrome i Edge).
- Interfejs API jest prostszy.
- Narzędzia są opracowywane pod kątem nowego interfejsu API do raportowania (w wersji 1).
Mając to na uwadze:
- Jeśli Twoja witryna korzysta już z interfejsu Reporting API w wersji 0 z nagłówkiem
Report-To
, przeprowadź migrację do interfejsu Reporting API w wersji 1 (patrz sposób przeprowadzenia migracji). Jeśli Twoja witryna korzysta już z funkcji zgłaszania naruszeń dyrektywy Content Security Policy, zapoznaj się z szczegółami migracji w przypadku zgłaszania naruszeń CSP. - Jeśli Twoja witryna nie korzysta jeszcze z interfejsu Reporting API i dodajesz do niej funkcję raportowania:
użyj nowego interfejsu Reporting API (w wersji 1) (nagłówek
Reporting-Endpoints
). Jest jednak jedno zastrzeżenie: jeśli musisz używać rejestrowania błędów sieci, użyjReport-To
(w wersji 0). Logowanie błędów sieci nie jest obecnie obsługiwane w interfejsie Reporting API w wersji 1. Będziemy opracowywać nowy mechanizm rejestrowania błędów sieci. Do tego czasu używaj interfejsu Reporting API w wersji 0. Jeśli potrzebujesz rejestrowania błędów sieci oraz innych typów raportów, użyj obu opcjiReport-To
(wersja 0) iReporting-Endpoints
(wersja 1). Wersja 0 umożliwia rejestrowanie błędów sieci, a wersja 1 – raportowanie wszystkich innych typów.
Etapy migracji
Celem tej migracji jest uniknięcie utraty raportów, które były dostępne w wersji 0.
Krok 1 (do tej pory): użyj obu nagłówków:
Report-To
(w wersji 0) iReporting-Endpoints
(w wersji 1).Dzięki temu:
- Raporty z nowych klientów Chrome i Edge dzięki
Reporting-Endpoints
(w wersji 1). - Raporty ze starszych klientów Chrome i Edge dzięki interfejsowi
Report-To
(w wersji 0).
Instanse przeglądarki, które obsługują
Reporting-Endpoints
, będą używaćReporting-Endpoints
, a te, które nie obsługują, będą używaćReport-To
. Format żądania i raportu jest taki sam w przypadku wersji 0 i 1.- Raporty z nowych klientów Chrome i Edge dzięki
Krok 2 (do tej pory): sprawdź, czy nagłówek
Reporting-Endpoints
jest ustawiony we wszystkich odpowiedziach, które mogą generować raporty.W wersji 0 można było ustawić punkty końcowe raportowania tylko w niektórych odpowiedziach, a inne dokumenty (strony) w tym pochodzeniu używały tego „ambientalnego” punktu końcowego. W wersji 1 ze względu na różnice w zakresie działania musisz ustawić nagłówek
Reporting-Endpoints
we wszystkich odpowiedziach, które mogą generować raporty.Krok 3 (rozpocznij później): gdy wszyscy lub większość użytkowników zaktualizują Chrome lub Edge do nowszych wersji (96 i nowszych), usuń
Report-To
(w wersji 0) i zachowaj tylkoReporting-Endpoints
.Wyjątek: jeśli potrzebujesz raportów z rejestrowania błędów sieciowych, zachowaj
Report-To
do czasu wdrożenia nowego mechanizmu rejestrowania błędów sieciowych.
Przykłady kodu znajdziesz w książce kucharskiej migracji.
Kroki migracji dotyczące raportowania w CSP
Raporty o naruszeniu Content-Security-Policy można skonfigurować na 2 sposoby:
- Tylko nagłówek CSP za pomocą dyrektywy
report-uri
. Ta funkcja jest obsługiwana w wielu przeglądarkach, takich jak Chrome, Firefox, Safari i Edge. Raporty są wysyłane z typem treściapplication/csp-report
i mają format właściwy dla CSP. Te raporty nazywają się „Raporty CSP poziomu 2” i nie są zależne od interfejsu Reporting API. - W przypadku interfejsu Reporting API można to zrobić za pomocą nagłówka
Report-To
(w starszej wersji) lub nowszego nagłówkaReporting-Endpoints
(w wersji 1). Ta funkcja jest obsługiwana tylko w Chrome i Edge. Prośby o raporty mają ten sam format co inne żądania interfejsu Reporting API i mają ten sam typ treściapplication/reports+json
.
Pierwsze podejście (tylko report-uri
) nie jest już zalecane, a drugie podejście ma kilka zalet. W szczególności umożliwia to skonfigurowanie raportowania we wszystkich typach raportów za pomocą jednej metody oraz ustawienie ogólnego punktu końcowego (ponieważ wszystkie żądania raportu wygenerowane za pomocą interfejsu Reporting API⏤CSP i innych⏤ mają ten sam format: application/reports+json
.
Jednak report-to
obsługuje tylko kilka przeglądarek.
Dlatego zalecamy, aby report-uri
stosować równolegle z interfejsem API do raportowania (Report-To
lub lepiej Reporting-Endpoints
), aby otrzymywać raporty o naruszeniu zasad CSP z wielu przeglądarek. W przeglądarce, która rozpoznaje report-uri
i report-to
, zasada report-uri
zostanie zignorowana, jeśli obecna jest zasada report-to
. W przeglądarce, która rozpoznaje tylko report-uri
, brany pod uwagę będzie tylko report-uri
.
Krok 1 (do tej pory): jeśli nie dodano jeszcze tego parametru, dodaj
report-to
obokreport-uri
. Przeglądarki, które obsługują tylkoreport-uri
(Firefox), będą używaćreport-uri
, a przeglądarki, które obsługują teżreport-to
(Chrome, Edge), będą używaćreport-to
. Aby określić nazwane punkty końcowe, których użyjesz wreport-to
, użyj nagłówkówReport-To
iReporting-Endpoints
. Dzięki temu będziesz otrzymywać raporty zarówno ze starszych, jak i nowszych klientów Chrome i Edge.Krok 3 (rozpocznij później): gdy wszyscy lub większość użytkowników zaktualizują Chrome lub Edge do nowszych wersji (96 i nowszych), usuń
Report-To
(w wersji 0) i zachowaj tylkoReporting-Endpoints
. Zachowajreport-uri
, aby nadal otrzymywać raporty z przeglądarek, które obsługują tylko tę metodę.
Przykłady kodu dla tych kroków znajdziesz w artykule Migrowanie raportowania z usług CSP.
Migracja: przykładowy kod
Omówienie
Jeśli korzystasz z poprzedniej wersji interfejsu Reporting API (w wersji 0), aby otrzymywać raporty o naruszeniu zasad dotyczących:
– zasad COOP (główny nagłówek Cross-Origin-Opener-Policy
),
– zasad COEP (główny nagłówek Cross-Origin-Embedder-Policy
) lub
– zasad dotyczących dokumentu (główny nagłówek Document-Policy
).
Nie musisz zmieniać tych nagłówków zasad podczas migracji do interfejsu Reporting API w wersji 1. Musisz tylko przejść z starego nagłówka Report-To
na nowy nagłówek Reporting-Endpoints
.
Jeśli używasz starszego interfejsu Reporting API (wersja 0) do otrzymywania raportów o naruszeniu zasad dotyczących mechanizmu CSP (nagłówek Content-Security-Policy
), w ramach migracji na nowy interfejs Reporting API (wersja 1) możesz potrzebować dostosowania Content-Security-Policy
.
Podstawowa migracja
Report-To: { group: "main-endpoint", "endpoints": [ { "url": "https://reports.example/main" }] }, { group: "default-endpoint", "endpoints": [ { "url": "https://reports.example/default" }] }
Reporting-Endpoints: main-endpoint="https://reports.example/main", default="https://reports.example/default" Report-To: { group: "main-endpoint", "max_age": 86400, "endpoints": [ { "url": "https://reports.example/main" }] }, { group: "default-endpoint", "max_age": 86400, "endpoints": [ { "url": "https://reports.example/default" }] }
Jeśli w swojej witrynie masz już funkcję raportowania, zachowaj Report-To
tylko tymczasowo (do czasu zaktualizowania większości klientów Chrome i Edge), aby nie utracić raportów.
Jeśli potrzebujesz rejestrowania błędów sieci, zachowaj Report-To
do czasu udostępnienia zamiennika.
Reporting-Endpoints: main-endpoint="https://reports.example/main", default="https://reports.example/default"
Tak może wyglądać Twój kod w przyszłości, gdy większość klientów Chrome i Edge zostanie zaktualizowana i obsługiwać będzie interfejs API w wersji 1.
Pamiętaj, że w wersji 1 nadal możesz wysyłać określone typy raportów do określonych punktów końcowych. Możesz jednak użyć tylko 1 adresu URL na punkt końcowy.
Obserwowanie wszystkich stron
app.get("/", (request, response) => { response.set("Report-To", …) response.render(...) }); app.get("/page1", (request, response) => { response.render(...) });
W wersji 0 możesz skonfigurować punkty końcowe raportowania tylko w przypadku niektórych odpowiedzi. Inne dokumenty (strony) w tym pochodzeniu automatycznie korzystają z tych punktów końcowych. Tutaj punkty końcowe ustawione dla "/"
są używane we wszystkich odpowiedziach, np. dla page1
.
// Use a middleware to set the reporting endpoint(s) for *all* requests. app.use(function(request, response, next) { response.set("Reporting-Endpoints", …); next(); }); app.get("/", (request, response) => { response.render(...) }); app.get("/page1", (request, response) => { response.render(...) });
W wersji 1 musisz ustawić nagłówek Reporting-Endpoints
we wszystkich odpowiedziach, które mogą generować raporty.
Migracja raportów CSP
Content-Security-Policy: ...; report-uri https://reports.example/main
Używanie tylko atrybutu report-uri
nie jest już zalecane.
Jeśli Twój kod wygląda jak powyżej, przeprowadź migrację. Poniżej (na zielono) znajdziesz przykłady nowego kodu.
Content-Security-Policy: ...; report-uri https://reports.example/main; report-to main-endpoint Report-To: main-endpoint="https://reports.example/main"
Lepiej jest użyć kodu, który używa parametru report-to, który jest nowszą wersją parametru report-uri. W celu zachowania zgodności wstecznej nadal zachowuje parametr report-uri. Wiele przeglądarek nie obsługuje parametru report-to
, ale obsługuje parametr report-uri
.
Można to jednak ulepszyć: ten kod używa interfejsu Reporting API w wersji 0 (nagłówek Report-To
). Przejście na wersję 1: poniżej znajdziesz przykłady „Nowego kodu” (w kolorze zielonym).
Content-Security-Policy: ...; report-uri https://reports.example/main; report-to main-endpoint Reporting-Endpoints: main-endpoint="https://reports.example/main" Report-To: ...
Zachowaj dyrektywę report-uri
obok dyrektywy report-to
, dopóki ta ostatnia nie będzie obsługiwana we wszystkich przeglądarkach.report-to
Zobacz tabelę zgodności z przeglądarkami.
Tymczasowo Report-To
będzie wyświetlana obok Reporting-Endpoints
. Gdy większość użytkowników Chrome i Edge zainstaluje wersję 96 lub nowszą, usuń Report-To
.
Więcej informacji
- Monitorowanie aplikacji internetowej za pomocą interfejsu Reporting API (główny wpis na temat interfejsu Reporting API)
- Specyfikacja: starsza wersja interfejsu Reporting API (wersja 0)
- Specyfikacja: nowy interfejs Reporting API (wersja 1)
Dziękujemy Ianowi Clellandowi, Eiji Kitamurze i Milicy Mihajlija za opinie i sugestie dotyczące tego artykułu.