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

Modyfikowanie żądań sieciowych w Manifest V3

Manifest V3 zmienia sposób, w jaki rozszerzenia modyfikują żądania sieciowe. Zamiast przechwytywać żądania sieciowe i zmieniać je w czasie działania za pomocą chrome.webRequest, rozszerzenie określa reguły, które opisują działania do wykonania po spełnieniu określonego zestawu warunków. Zrób to za pomocą interfejsu Declarative Net Request API.

Interfejsy Web Request API i Deklaratywne Net Request API różnią się znacznie od siebie. Zamiast zastępowania jednego wywołania funkcji innym musisz przerobić kod pod kątem przypadków użycia. W tej sekcji opisujemy ten proces.

W platformie Manifest V2 blokowanie żądań sieciowych może znacznie pogorszyć zarówno wydajność rozszerzeń, jak i wydajności stron, z którymi współpracują. Przestrzeń nazw webRequest obsługuje 9 zdarzeń, które mogą blokować działanie aplikacji. Każde z nich może wywołać nieograniczoną liczbę przetwarzaczy zdarzeń. Co gorsza, każda strona internetowa może być blokowana przez wiele rozszerzeń, a wymagające tego uprawnienia są inwazyjne. Manifest V3 chroni przed tym problemem przez zastąpienie wywołań zwrotnych regułami deklaratywnymi.

To druga z 3 sekcji opisujących zmiany potrzebne w kodzie, który nie jest częścią rozszerzenia usługi. Opisuje ona konwertowanie blokujących żądań sieciowych używanych przez Manifest V2 na deklaratywnie żądania sieciowe używane przez Manifest V3. Pozostałe 2 sekcje dotyczą aktualizowania kodu, który jest potrzebny do przejścia na Manifest V3, oraz ulepszania zabezpieczeń.

Aktualizuj uprawnienia

Wprowadź te zmiany w polu "permissions" w konfiguracji manifest.json.

  • Usuń uprawnienie "webRequest", jeśli nie musisz już obserwować żądań sieciowych.
  • Przenieś wzorce dopasowania z poziomu "permissions" na poziom "host_permissions".

W zależności od przypadku użycia musisz dodać inne uprawnienia. Te uprawnienia są opisane w ramach przypadku użycia, który obsługują.

Utwórz deklaratywne reguły żądań netto

Aby utworzyć deklaratywne reguły sieciowe, musisz dodać obiekt "declarative_net_request" do obiektu manifest.json. Blok "declarative_net_request" zawiera tablicę obiektów "rule_resource", które wskazują plik reguł. Plik reguły zawiera tablicę obiektów określających działanie i warunki, w których są one wywoływane.

Częste zastosowania

W kolejnych sekcjach opisano typowe przypadki użycia deklaratywnych zapytań sieciowych. Poniżej znajdziesz tylko krótkie omówienie. Więcej informacji o wszystkich opisanych tu kwestiach znajdziesz w dokumentacji interfejsu API w sekcji chrome.declarativeNetRequest.

Blokowanie pojedynczego adresu URL

Częstym przypadkiem użycia w pliku manifestu V2 było blokowanie żądań sieciowych za pomocą zdarzenia onBeforeRequest w skrypcie uruchamianym w tle.

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

W przypadku pliku manifestu V3 utwórz nową regułę declarativeNetRequest, używając typu działania "block". Zwróć uwagę na obiekt "condition" w przykładowej regule. Jego "urlFilter" zastępuje opcję urls przekazaną do odbiorcy webRequest. Tablica "resourceTypes" określa kategorię zasobów do zablokowania. W tym przykładzie blokujemy tylko główną stronę HTML, ale możesz na przykład zablokować tylko czcionki.

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

Aby to działało, musisz zaktualizować uprawnienia rozszerzenia. W manifest.json zastąp uprawnienie "webRequestBlocking" uprawnieniem "declarativeNetRequest". Zwróć uwagę, że adres URL został usunięty z pola "permissions", ponieważ blokowanie treści nie wymaga uprawnień hosta. Jak widać powyżej, plik reguły określa hosta lub hostów, do których ma zastosowanie deklaratywna prośba o netto.

Jeśli chcesz to wypróbować, kod poniżej jest dostępny w repozytorium z przykładami.

(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 jest użycie zdarzenia BeforeRequest do przekierowywania żądań sieciowych.

Skrypt tła 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 pliku manifestu w wersji 3 użyj typu działania "redirect". Jak poprzednio, "urlFilter" zastępuje opcję url przekazaną do słuchacza webRequest. Zwróć uwagę, że w tym przykładzie obiekt "action" pliku reguły zawiera pole "redirect" zawierające URL do zwrócenia, a nie filtrowany adres.

Plik reguł manifestu 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"]
    }
  }

W tym przypadku musisz też zmienić uprawnienia rozszerzenia. Podobnie jak wcześniej zastąp uprawnienie "webRequestBlocking" uprawnieniem "declarativeNetRequest". Adresy URL są ponownie przenoszone z folderu manifest.json do pliku reguł. Zwróć uwagę, że przekierowanie wymaga też uprawnień "declarativeNetRequestWithHostAccess", a nie tylko uprawnień hosta.

Jeśli chcesz to wypróbować, poniżej znajdziesz kod dostępny w repozytorium z przykładami.

(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/*"
  ]

Blokowanie plików cookie

W pliku manifestu V2 zablokowanie plików cookie wymaga przechwycenia nagłówków żądań internetowych przed ich wysłaniem i usunięcia konkretnego nagłówka.

Skrypt działający 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 pobiera tablicę obiektów "requestHeaders", określającą nagłówki do modyfikacji oraz sposób ich modyfikacji. Zwróć uwagę, że obiekt "condition" zawiera tylko tablicę "resourceTypes". Obsługuje te same wartości co w poprzednich przykładach.

Jeśli chcesz to wypróbować, poniżej znajdziesz kod dostępny w repozytorium z przykładami.

Plik manifest.json na platformie Manifest V3
[
  {
    "id": 1,
    "priority": 1,
    "action": {
      "type": "modifyHeaders",
      "requestHeaders": [
        { "header": "cookie", "operation": "remove" }
      ]
    },
    "condition": {
      "urlFilter": "|*?no-cookies=1",
      "resourceTypes": ["main_frame"]
    }
  }
]

W tym przypadku musisz też zmienić uprawnienia rozszerzenia. Tak jak poprzednio zastąp uprawnienie "webRequestBlocking" uprawnieniem "declarativeNetRequest".

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