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

Modyfikowanie żądań sieciowych w pliku manifestu 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 przypadku manifestu v2 blokowanie żądań internetowych może znacznie obniżyć wydajność rozszerzeń i 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 mogą być inwazyjne. Manifest V3 chroni przed tym problemem przez zastąpienie wywołań zwrotnych regułami deklaratywnymi.

To druga z 3 sekcji opisujących zmiany wymagane 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ą.

Tworzenie deklaratywnych reguł żądań sieciowych

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.

Typowe 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 odsłuchiwania przez webRequest. Tablica "resourceTypes" określa kategorię zasobów do zablokowania. W tym przykładzie blokowana jest tylko główna strona HTML, ale możesz zablokować na przykład 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",
  ]

Przekierowywanie wielu adresów URL

Innym częstym zastosowaniem w przypadku Manifest V2 było używanie zdarzenia BeforeRequest do przekierowywania żądań internetowych.

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ł zawiera pole "redirect", w którym zamiast filtrowanego adresu URL znajduje się zwracany adres URL.

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ł. Pamiętaj, że przekierowywanie wymaga uprawnienia "declarativeNetRequestWithHostAccess" oprócz uprawnienia hosta.

Jeśli chcesz to wypróbować, kod poniżej jest 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 tła 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 również wykonuje to za pomocą reguły w pliku reguł. Tym razem typ działania to "modifyHeaders". Plik przyjmuje tablicę obiektów "requestHeaders", która określa nagłówki do zmodyfikowania i 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.

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

W tym scenariuszu trzeba też zmienić uprawnienia rozszerzenia. Podobnie jak wcześniej zastąp uprawnienie "webRequestBlocking" uprawnieniem "declarativeNetRequest".

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