Engelleme yapan web isteği işleyicilerini değiştirin

Manifest V3'te ağ isteklerini değiştirme

Manifest V3, uzantıların ağ isteklerinde yapılan değişiklikleri işleme şeklini değiştirir. Uzantınız, ağ isteklerine müdahale etmek ve bunları çalışma zamanında chrome.webRequest ile değiştirmek yerine, belirli bir koşul kümesi karşılandığında gerçekleştirilecek işlemleri açıklayan kurallar belirtir. Bu işlemi Declarative Net Request API'yi kullanarak yapın.

Web Request API ve Declarative Net Request API'leri birbirinden önemli ölçüde farklıdır. Bir işlev çağrısını başka bir işlev çağrısıyla değiştirmek yerine, kodunuzu kullanım alanları açısından yeniden yazmanız gerekir. Bu bölüm, bu süreçte size yol gösterecektir.

Manifest V2'de, web isteklerini engellemek hem uzantıların performansını hem de birlikte çalıştıkları sayfaların performansını önemli ölçüde düşürebilir. webRequest ad alanı, her biri sınırsız sayıda etkinlik işleyici gerektiren dokuz potansiyel olarak engelleme etkinliği destekler. İşin daha da kötüsü, her web sayfası potansiyel olarak birden fazla uzantı tarafından engelleniyor ve bunun için gereken izinler engelleniyor. Manifest V3, geri çağırmaları bildirim temelli kurallarla değiştirerek bu soruna karşı koruma sağlar.

Bu, uzantı hizmet çalışanının parçası olmayan kod için gerekli değişiklikleri açıklayan üç bölümden ikincisidir. Bu bölümde, Manifest V2 tarafından kullanılan engelleme web isteklerinin Manifest V3 tarafından kullanılan bildirim temelli net isteklere dönüştürülmesi açıklanmaktadır. Diğer iki bölümde, Manifest V3'e geçmek için gereken kodunuzu güncelleme ve güvenliği iyileştirme konularına yer verilmiştir.

İzinleri güncelle

manifest.json hesabınızdaki "permissions" alanında aşağıdaki değişiklikleri yapın.

  • Artık ağ isteklerini gözlemlemeniz gerekmiyorsa "webRequest" iznini kaldırın.
  • Eşleşme Kalıplarını "permissions" kuruluş biriminden "host_permissions" kuruluş birimine taşıyın.

Kullanım alanınıza bağlı olarak başka izinler eklemeniz gerekir. Bu izinler, destekledikleri kullanım alanıyla açıklanmaktadır.

Bildirim temelli net istek kuralları oluşturma

Bildirim temelli net istek kuralları oluşturmak için manifest.json öğenize "declarative_net_request" nesnesi eklemeniz gerekir. "declarative_net_request" bloğu, bir kural dosyasına işaret eden "rule_resource" nesne dizisi içeriyor. Kural dosyası, bir işlemi ve bu işlemlerin çağrıldığı koşulları belirten bir nesne dizisi içerir.

Yaygın kullanım alanları

Aşağıdaki bölümlerde bildirim temelli net isteklerin yaygın kullanım alanları açıklanmaktadır. Aşağıdaki talimatlar yalnızca kısa bir özet içermektedir. Buradaki tüm bilgiler hakkında daha fazla bilgiyi chrome.declarativeNetRequest altındaki API referansında bulabilirsiniz.

Tek bir URL'yi engelleme

Manifest V2'de yaygın bir kullanım alanı, arka plandaki komut dosyasını kullanan onBeforeRequest etkinliğini kullanarak web isteklerini engellemekti.

Manifest V2 arka plan komut dosyası
chrome.webRequest.onBeforeRequest.addListener((e) => {
    return { cancel: true };
}, { urls: ["https://www.example.com/*"] }, ["blocking"]);

Manifest V3 için "block" işlem türünü kullanarak yeni bir declarativeNetRequest kuralı oluşturun. Örnek kuraldaki "condition" nesnesine dikkat edin. "urlFilter", webRequest işleyiciye iletilen urls seçeneğinin yerini alır. "resourceTypes" dizisi, engellenecek kaynakların kategorisini belirtir. Bu örnek yalnızca ana HTML sayfasını engeller ancak örneğin yalnızca yazı tiplerini engelleyebilirsiniz.

Manifest V3 kural dosyası
[
  {
    "id" : 1,
    "priority": 1,
    "action" : { "type" : "block" },
    "condition" : {
      "urlFilter" : "||example.com",
      "resourceTypes" : ["main_frame"]
    }
  }
]

Bu işlevin çalışması için uzantının izinlerini güncellemeniz gerekir. manifest.json bölümünde "webRequestBlocking" iznini "declarativeNetRequest" izniyle değiştirin. İçeriği engellemek ana makine izinleri gerektirmediğinden URL'nin "permissions" alanından kaldırıldığına dikkat edin. Yukarıda gösterildiği gibi kural dosyası, bildirim temelli net isteğinin geçerli olduğu ana makineyi veya ana makineleri belirtir.

Bunu denemek isterseniz aşağıdaki kodu örnekler depomuzda bulabilirsiniz.

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

Birden çok URL'yi yönlendirme

Manifest V2'deki bir diğer yaygın kullanım alanı, web isteklerini yönlendirmek için BeforeRequest etkinliğinin kullanılmasıydı.

Manifest V2 arka plan komut dosyası
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"]
);

Manifest V3 için "redirect" işlem türünü kullanın. Daha önce olduğu gibi "urlFilter", webRequest işleyiciye iletilen url seçeneğinin yerini alır. Bu örnekte, kural dosyasının "action" nesnesinin, filtrelenen URL yerine döndürülecek URL'yi içeren bir "redirect" alanı içerdiğine dikkat edin.

Manifest V3 kural dosyası
[
  {
    "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"]
    }
  }

Bu senaryo, uzantının izinlerinde de değişiklik yapılmasını gerektirir. Daha önce olduğu gibi "webRequestBlocking" iznini "declarativeNetRequest" izniyle değiştirin. URL'ler tekrar manifest.json klasöründen bir kural dosyasına taşınır. Yönlendirme için ana makine izninin yanı sıra "declarativeNetRequestWithHostAccess" izni de gerektiğini unutmayın.

Bunu denemek isterseniz aşağıdaki kodu örnekler depomuzda bulabilirsiniz.

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

Çerezleri engelle

Manifest V2'de çerezlerin engellenmesi, gönderilmeden önce web isteği üstbilgilerine müdahale ederek belirli başlıkların kaldırılmasını gerektirir.

Manifest V2 arka plan komut dosyası
chrome.webRequest.onBeforeSendHeaders.addListener(
  function(details) {
    removeHeader(details.requestHeaders, 'cookie');
    return {requestHeaders: details.requestHeaders};
  },
  // filters
  {urls: ['https://*/*', 'http://*/*']},
  // extraInfoSpec
  ['blocking', 'requestHeaders', 'extraHeaders']);

Manifest V3, bunu bir kural dosyasındaki bir kuralla da yapar. Bu sefer işlem türü "modifyHeaders". Dosya, değiştirilecek başlıkları ve bunların nasıl değiştirileceğini belirten bir "requestHeaders" nesne dizisi alır. "condition" nesnesinin yalnızca bir "resourceTypes" dizisi içerdiğine dikkat edin. Önceki örneklerle aynı değerleri destekler.

Bunu denemek isterseniz aşağıdaki kodu örnekler depomuzda bulabilirsiniz.

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

Bu senaryo, uzantının izinlerinde de değişiklik yapılmasını gerektirir. Daha önce olduğu gibi "webRequestBlocking" iznini "declarativeNetRequest" izniyle değiştirin.

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