Zastąp blokowanie detektorów żądań internetowych

Modyfikowanie żądań sieciowych w platformie Manifest V3

Platforma Manifest V3 zmienia sposób, w jaki rozszerzenia obsługują modyfikowanie żądań sieciowych. Zamiast przechwytywać żądania sieciowe i zmieniać je w czasie działania za pomocą zasady chrome.webRequest, rozszerzenie określa reguły opisujące działania, które należy wykonać, gdy zostanie spełniony określony zestaw warunków. Możesz to zrobić za pomocą deklaratywnego interfejsu Net Request API.

Interfejsy Web Request API i Deklaracja Net Request API znacznie się różnią. Zamiast zastępowania jednego wywołania funkcji innym, musisz przeredagować kod pod kątem przypadków użycia. Z tej sekcji dowiesz się, jak to zrobić.

W platformie Manifest V2 blokowanie żądań internetowych może znacznie obniżyć wydajność rozszerzeń i stron, z którymi współpracują. Przestrzeń nazw webRequest obsługuje 9 potencjalnie blokujących zdarzeń, a każde z nich wymaga nieograniczonej liczby modułów obsługi zdarzeń. Co gorsza, każda strona internetowa jest potencjalnie blokowana przez wiele rozszerzeń, a wymagane do tego uprawnienia są inwazyjne. Manifest V3 chroni przed tym problemem, zastępując wywołania zwrotne regułami deklaratywnymi.

Jest to druga z trzech sekcji opisujących zmiany niezbędne w kodzie, który nie jest częścią skryptu service worker rozszerzeń. Opisuje on konwertowanie blokujących żądań internetowych, z których korzysta platforma Manifest V2, w deklaratywne żądania netto używane przez platformę Manifest V3. Dwie pozostałe sekcje dotyczą aktualizacji kodu niezbędnego do migracji do platformy Manifest V3 i poprawy bezpieczeństwa.

Aktualizuj uprawnienia

Wprowadź poniższe zmiany w polu "permissions" w manifest.json.

  • Jeśli nie musisz już obserwować żądań sieciowych, usuń uprawnienie "webRequest".
  • Przenieś wzorce dopasowania z: "permissions" do: "host_permissions".

W zależności od zastosowania musisz dodać inne uprawnienia. Te uprawnienia są opisane w odpowiednim przypadku użycia.

Utwórz deklaratywne reguły żądania netto

Tworzenie deklaratywnej reguły żądań netto wymaga dodania obiektu "declarative_net_request" do manifest.json. Blok "declarative_net_request" zawiera tablicę obiektów "rule_resource", które wskazują plik reguły. Plik reguły zawiera tablicę obiektów określającą działanie i warunki ich wywoływania.

Typowe przypadki użycia

W sekcjach poniżej opisano typowe przypadki użycia deklaratywnych żądań netto. Poniższe instrukcje to tylko krótki opis. Więcej informacji na ten temat znajdziesz w dokumentacji interfejsu API w sekcji chrome.declarativeNetRequest.

Blokowanie pojedynczego adresu URL

Typowym przypadkiem użycia platformy Manifest V2 było blokowanie żądań internetowych za pomocą zdarzenia onBeforeRequest w skrypcie działającym w tle.

Skrypt w tle platformy Manifest V2
chrome.webRequest.onBeforeRequest.addListener((e) => {
    return { cancel: true };
}, { urls: ["https://www.example.com/*"] }, ["blocking"]);

W przypadku platformy Manifest V3 utwórz nową regułę declarativeNetRequest za pomocą typu działania "block". Zwróć uwagę na obiekt "condition" w przykładowej regule. "urlFilter" zastępuje opcję urls przekazaną do odbiornika webRequest. Tablica "resourceTypes" określa kategorię zasobów do zablokowania. W tym przykładzie blokuje się tylko główna strona HTML, ale można na przykład zablokować tylko czcionki.

Plik reguły platformy Manifest V3
[
  {
    "id" : 1,
    "priority": 1,
    "action" : { "type" : "block" },
    "condition" : {
      "urlFilter" : "||example.com",
      "resourceTypes" : ["main_frame"]
    }
  }
]

Aby korzystać z tej funkcji, musisz zaktualizować uprawnienia rozszerzenia. W manifest.json zastąp uprawnienie "webRequestBlocking" uprawnieniem "declarativeNetRequest". Zwróć uwagę, że adres URL jest usuwany z pola "permissions", ponieważ blokowanie treści nie wymaga uprawnień hosta. Jak pokazano powyżej, plik reguły określa hosta lub hosty, których dotyczy deklaratywne żądanie netto.

Jeśli chcesz spróbować, poniższy kod jest dostępny w naszym przykładowym repozytorium.

(platforma) Manifest V2
  "permissions": [
    "webRequestBlocking",
    "https://*.example.com/*"
  ]
(platforma) Manifest V3
  "permissions": [
    "declarativeNetRequest",
  ]

Przekierowanie wielu adresów URL

Innym typowym przypadkiem użycia platformy Manifest V2 było użycie zdarzenia BeforeRequest do przekierowywania żądań internetowych.

Skrypt w tle platformy Manifest V2
chrome.webRequest.onBeforeRequest.addListener((e) => {
    console.log(e);
    return { redirectUrl: "https://developer.chrome.com/docs/extensions/mv3/intro/" };
  }, { 
    urls: [
      "https://developer.chrome.com/docs/extensions/mv2/"
    ]
  }, 
  ["blocking"]
);

W przypadku platformy Manifest V3 użyj typu działania "redirect". Tak jak wcześniej, "urlFilter" zastępuje opcję url przekazaną do odbiornika webRequest. Zwróć uwagę, że w tym przykładzie obiekt "action" pliku reguły zawiera pole "redirect" z adresem URL, który ma zostać zwrócony zamiast adresu URL filtrowanego.

Plik reguły platformy Manifest V3
[
  {
    "id" : 1,
    "priority": 1,
    "action": {
      "type": "redirect",
      "redirect": { "url": "https://developer.chrome.com/docs/extensions/mv3/intro/" }
    },
    "condition": {
      "urlFilter": "https://developer.chrome.com/docs/extensions/mv2/",
      "resourceTypes": ["main_frame"]
    }
  }

Ten scenariusz wymaga też wprowadzenia zmian w uprawnieniach rozszerzenia. Tak jak wcześniej, zastąp uprawnienie "webRequestBlocking" uprawnieniem "declarativeNetRequest". Adresy URL są ponownie przenoszone z pliku manifest.json do pliku reguły. Zwróć uwagę, że przekierowanie wymaga też uprawnienia "declarativeNetRequestWithHostAccess" oprócz uprawnienia do hosta.

Jeśli chcesz spróbować, poniższy kod jest dostępny w naszym przykładowym repozytorium.

(platforma) Manifest V2
  "permissions": [
    "webRequestBlocking",
    "https://developer.chrome.com/docs/extensions/*",
    "https://developer.chrome.com/docs/extensions/reference"
  ]
(platforma) Manifest V3
  "permissions": [
    "declarativeNetRequestWithHostAccess"
  ],
  "host_permissions": [
    "https://developer.chrome.com/*"
  ]

Blokuj pliki cookie

W platformie Manifest V2 blokowanie plików cookie wymaga przechwycenia nagłówków żądań internetowych przed ich wysłaniem i usunięcia konkretnego.

Skrypt w tle platformy Manifest V2
chrome.webRequest.onBeforeSendHeaders.addListener(
  function(details) {
    removeHeader(details.requestHeaders, 'cookie');
    return {requestHeaders: details.requestHeaders};
  },
  // filters
  {urls: ['https://*/*', 'http://*/*']},
  // extraInfoSpec
  ['blocking', 'requestHeaders', 'extraHeaders']);

Manifest V3 robi to również za pomocą reguły w pliku reguł. Tym razem typ działania to "modifyHeaders". Plik przyjmuje tablicę obiektów "requestHeaders", które określają nagłówki do zmiany i sposób ich modyfikacji. Zwróć uwagę, że obiekt "condition" zawiera tylko tablicę "resourceTypes". To ustawienie obsługuje te same wartości co w poprzednich przykładach.

Jeśli chcesz spróbować, poniższy kod jest dostępny w naszym przykładowym repozytorium.

Plik manifestu w wersji 3 (Manifest.json)
[
  {
    "id": 1,
    "priority": 1,
    "action": {
      "type": "modifyHeaders",
      "requestHeaders": [
        { "header": "cookie", "operation": "remove" }
      ]
    },
    "condition": {
      "urlFilter": "|*?no-cookies=1",
      "resourceTypes": ["main_frame"]
    }
  }
]

Ten scenariusz wymaga też wprowadzenia zmian w uprawnieniach rozszerzenia. Tak jak wcześniej, zastąp uprawnienie "webRequestBlocking" uprawnieniem "declarativeNetRequest".

(platforma) Manifest V2
  "permissions": [
    "webRequest",
    "webRequestBlocking",
    "https://*/*",
    "http://*/*"
  ],
(platforma) Manifest V3
  "permissions": [
    "declarativeNetRequest",
  ],
  "host_permissions": [
    ""
  ]