مسدود کردن شنوندگان درخواست وب را جایگزین کنید

تغییر درخواست های شبکه در Manifest V3

Manifest V3 نحوه مدیریت برنامه‌های افزودنی با اصلاح درخواست‌های شبکه را تغییر می‌دهد. به جای رهگیری درخواست‌های شبکه و تغییر آن‌ها در زمان اجرا با chrome.webRequest ، برنامه افزودنی شما قوانینی را مشخص می‌کند که اقداماتی را برای انجام در هنگام برآورده شدن مجموعه‌ای از شرایط مشخص می‌کند. این کار را با استفاده از Declarative Net Request API انجام دهید.

Web Request API و Declarative Net Request API تفاوت قابل توجهی دارند. به جای جایگزینی یک فراخوانی با تابع دیگر، باید کد خود را از نظر موارد استفاده بازنویسی کنید. این بخش شما را در این فرآیند راهنمایی می کند.

در Manifest V2، مسدود کردن درخواست‌های وب می‌تواند عملکرد برنامه‌های افزودنی و عملکرد صفحاتی را که با آن‌ها کار می‌کنند به میزان قابل توجهی کاهش دهد. فضای نام webRequest از نه رویداد بالقوه مسدودکننده پشتیبانی می‌کند که هر کدام تعداد نامحدودی از کنترل‌کننده‌های رویداد را می‌گیرند. بدتر از همه، هر صفحه وب به طور بالقوه توسط چندین افزونه مسدود می شود و مجوزهای مورد نیاز برای این کار تهاجمی هستند. Manifest V3 با جایگزینی callbacks با قوانین اعلامی از این مشکل محافظت می کند.

این دومین بخش از سه بخش است که تغییرات مورد نیاز برای کدی را که بخشی از کارمند خدمات توسعه نیست را توضیح می دهد. این تبدیل درخواست های مسدود کننده وب را که توسط Manifest V2 استفاده می شود، به درخواست های خالص اعلامی که توسط Manifest V3 استفاده می شود، توصیف می کند. دو بخش دیگر به‌روزرسانی کد مورد نیاز برای مهاجرت به Manifest V3 و بهبود امنیت را پوشش می‌دهد.

به روز رسانی مجوزها

تغییرات زیر را در قسمت "permissions" در manifest.json خود اعمال کنید.

  • اگر دیگر نیازی به مشاهده درخواست‌های شبکه ندارید، مجوز "webRequest" را حذف کنید.
  • الگوهای مطابقت را از "permissions" به "host_permissions" منتقل کنید.

بسته به مورد استفاده خود، باید مجوزهای دیگری را اضافه کنید. این مجوزها با مورد استفاده ای که پشتیبانی می کنند توضیح داده شده اند.

قوانین درخواست خالص اعلامی ایجاد کنید

ایجاد قوانین درخواست شبکه اعلامی مستلزم افزودن یک شی "declarative_net_request" به manifest.json شما است. بلوک "declarative_net_request" حاوی آرایه ای از اشیاء "rule_resource" است که به یک فایل قانون اشاره می کنند. فایل قانون حاوی آرایه ای از اشیاء است که یک عمل و شرایطی را که در آن اقدامات فراخوانی می شوند را مشخص می کند.

موارد استفاده رایج

بخش‌های زیر موارد استفاده رایج برای درخواست‌های خالص اعلامی را شرح می‌دهند. دستورالعمل های زیر فقط یک طرح کلی ارائه می دهد. اطلاعات بیشتر درباره همه اطلاعات اینجا در مرجع API در زیر chrome.declarativeNetRequest توضیح داده شده است.

یک URL واحد را مسدود کنید

یک مورد رایج در Manifest V2 مسدود کردن درخواست‌های وب با استفاده از رویداد onBeforeRequest در اسکریپت پس‌زمینه بود.

اسکریپت پس زمینه Manifest V2
chrome.webRequest.onBeforeRequest.addListener((e) => {
    return { cancel: true };
}, { urls: ["https://www.example.com/*"] }, ["blocking"]);

برای Manifest V3، با استفاده از نوع عمل "block" یک قانون declarativeNetRequest جدید ایجاد کنید. به شیء "condition" در قانون مثال توجه کنید. "urlFilter" آن جایگزین گزینه urls ارسال شده به شنونده webRequest می شود. آرایه "resourceTypes" دسته منابعی را که باید مسدود شوند را مشخص می کند. این مثال فقط صفحه اصلی HTML را مسدود می کند، اما برای مثال می توانید فقط فونت ها را مسدود کنید.

فایل قانون Manifest V3
[
  {
    "id" : 1,
    "priority": 1,
    "action" : { "type" : "block" },
    "condition" : {
      "urlFilter" : "||example.com",
      "resourceTypes" : ["main_frame"]
    }
  }
]

برای انجام این کار، باید مجوزهای برنامه افزودنی را به روز کنید. در manifest.json مجوز "webRequestBlocking" را با مجوز "declarativeNetRequest" جایگزین کنید. توجه داشته باشید که URL از قسمت "permissions" حذف شده است زیرا مسدود کردن محتوا به مجوزهای میزبان نیاز ندارد. همانطور که در بالا نشان داده شده است، فایل قانون میزبان یا میزبان هایی را که یک درخواست خالص اعلامی برای آنها اعمال می شود، مشخص می کند.

اگر می خواهید این کار را امتحان کنید، کد زیر در مخزن نمونه ما موجود است.

مانیفست V2
  "permissions": [
    "webRequestBlocking",
    "https://*.example.com/*"
  ]
مانیفست V3
  "permissions": [
    "declarativeNetRequest",
  ]

چندین URL را تغییر مسیر دهید

یکی دیگر از موارد استفاده رایج در Manifest V2 استفاده از رویداد BeforeRequest برای تغییر مسیر درخواست های وب بود.

اسکریپت پس زمینه 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"]
);

برای Manifest V3، از نوع اقدام "redirect" استفاده کنید. مانند قبل، "urlFilter" جایگزین گزینه url ارسال شده به شنونده webRequest می شود. توجه داشته باشید که برای این مثال، شی "action" فایل قانون حاوی یک فیلد "redirect" است که حاوی URL برای بازگشت به جای URL فیلتر شده است.

فایل قانون 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"]
    }
  }

این سناریو همچنین به تغییراتی در مجوزهای برنامه افزودنی نیاز دارد. مانند قبل، مجوز "webRequestBlocking" را با مجوز "declarativeNetRequest" جایگزین کنید. URL ها دوباره از manifest.json به یک فایل قانون منتقل می شوند. توجه داشته باشید که تغییر مسیر علاوه بر مجوز میزبان، به مجوز "declarativeNetRequestWithHostAccess" نیز نیاز دارد.

اگر می خواهید این کار را امتحان کنید، کد زیر در مخزن نمونه ما موجود است.

مانیفست V2
  "permissions": [
    "webRequestBlocking",
    "https://developer.chrome.com/docs/extensions/*",
    "https://developer.chrome.com/docs/extensions/reference"
  ]
مانیفست V3
  "permissions": [
    "declarativeNetRequestWithHostAccess"
  ],
  "host_permissions": [
    "https://developer.chrome.com/*"
  ]

مسدود کردن کوکی ها

در Manifest V2، مسدود کردن کوکی‌ها نیازمند رهگیری سرصفحه‌های درخواست وب قبل از ارسال و حذف یک مورد خاص است.

اسکریپت پس زمینه 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 نیز این کار را با یک قانون در یک فایل قانون انجام می دهد. این بار نوع عمل "modifyHeaders" است. فایل آرایه ای از اشیاء "requestHeaders" را می گیرد که سرصفحه هایی را برای تغییر و نحوه تغییر آنها را مشخص می کند. توجه داشته باشید که شیء "condition" فقط حاوی یک آرایه "resourceTypes" است. از همان مقادیر نمونه های قبلی پشتیبانی می کند.

اگر می خواهید این کار را امتحان کنید، کد زیر در مخزن نمونه ما موجود است.

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

این سناریو همچنین به تغییراتی در مجوزهای برنامه افزودنی نیاز دارد. مانند قبل، مجوز "webRequestBlocking" را با مجوز "declarativeNetRequest" جایگزین کنید.

مانیفست V2
  "permissions": [
    "webRequest",
    "webRequestBlocking",
    "https://*/*",
    "http://*/*"
  ],
مانیفست V3
  "permissions": [
    "declarativeNetRequest",
  ],
  "host_permissions": [
    ""
  ]