Перехват и модификация HTTP-запросов в расширениях MV3

Когда браузерное расширение должно блокировать нежелательные запросы, подменять заголовки или перенаправлять трафик, без перехвата HTTP-запросов не обойтись. Мы разрабатываем расширения на современном стандарте Manifest V3, используя declarativeNetRequest для надёжной и безопасной фильтрации. Наша команда реализует проект под ключ — от проектирования правил до кросс-браузерной поддержки и последующего сопровождения.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Перехват и модификация HTTP-запросов в расширениях MV3
Сложный
~2-3 дня
Часто задаваемые вопросы

Техническая реализация перехвата HTTP-запросов в браузерном расширении

Клиент ставит задачу: блокировать скрипты телеметрии, добавлять авторизационные заголовки к внутренним API и перенаправлять все медиа-запросы на быстрый CDN. Без перехвата HTTP-запросов не обойтись. Мы реализовали десятки таких расширений и знаем все подводные камни — от ограничений Manifest V3 до нюансов кросс-браузерной совместимости.

Раньше разработчики активно использовали chrome.webRequest с флагом blocking, но с переходом на Manifest V3 этот метод потерял гибкость. Современный стандарт — declarativeNetRequest, декларативный API, который переносит обработку правил на уровень браузера. Он быстрее, безопаснее и не нагружает основной поток, но накладывает строгие лимиты: одновременно можно активировать не более 5 000 правил. Разберём, как проектировать систему правил, чтобы обойти ограничения и сохранить полный контроль над трафиком.

Как перехватить запросы в MV3?

В основу положен декларативный подход: вы описываете правила в JSON, а браузер сам их применяет. Расширение не тратит CPU на анализ каждого запроса, а значит, Core Web Vitals не страдают.

Статические правила

Правила, определённые в файле rules/static.json, действуют постоянно. Пример настройки блока аналитики, модификации заголовков и редиректа:

[
  {
    "id": 1,
    "priority": 1,
    "action": {
      "type": "block"
    },
    "condition": {
      "urlFilter": "||analytics.example.com^",
      "resourceTypes": ["script", "xmlhttprequest", "image"]
    }
  },
  {
    "id": 2,
    "priority": 2,
    "action": {
      "type": "modifyHeaders",
      "requestHeaders": [
        {
          "header": "X-Custom-Token",
          "operation": "set",
          "value": "my-token"
        },
        {
          "header": "Referer",
          "operation": "remove"
        }
      ]
    },
    "condition": {
      "urlFilter": "https://api.internal.corp/*",
      "resourceTypes": ["xmlhttprequest"]
    }
  },
  {
    "id": 3,
    "priority": 1,
    "action": {
      "type": "redirect",
      "redirect": {
        "regexSubstitution": "https://cdn.example.com\\1"
      }
    },
    "condition": {
      "regexFilter": "^https://slow-cdn\\.com(.*)",
      "resourceTypes": ["image", "media", "font"]
    }
  }
]

Лимиты: до 30 000 статических правил суммарно, одновременно включено не более 5 000. Остальные можно активировать динамически через service worker.

Динамические правила

Если нужно добавлять правила на лету — используйте service worker. Например, блокировка/разблокировка домена или подстановка токена авторизации:

// background/sw.js
async function blockDomain(domain) {
  const existingRules = await chrome.declarativeNetRequest.getDynamicRules();
  const maxId = existingRules.reduce((max, r) => Math.max(max, r.id), 0);
  await chrome.declarativeNetRequest.updateDynamicRules({
    addRules: [{
      id: maxId + 1,
      priority: 10,
      action: { type: 'block' },
      condition: {
        urlFilter: `||${domain}^`,
        resourceTypes: [
          'main_frame',
          'sub_frame',
          'script',
          'stylesheet',
          'image',
          'xmlhttprequest',
          'other'
        ]
      }
    }],
    removeRuleIds: []
  });
}

Как модифицировать тело запроса через content script?

declarativeNetRequest не позволяет менять тело. Для этого используйте content script с world 'MAIN', перехватив fetch и XMLHttpRequest. Пример инъекции поля в тело POST-запроса:

const originalFetch = window.fetch;
window.fetch = async function(input, init = {}) {
  const url = typeof input === 'string' ? input : input.url;
  if (url.includes('api.target.com')) {
    init.headers = {
      ...init.headers,
      'X-Injected-Header': 'value',
    };
    if (init.body) {
      const body = JSON.parse(init.body);
      body.extraField = 'injected';
      init.body = JSON.stringify(body);
    }
  }
  return originalFetch.call(this, input, init);
};

Учтите: monkey-patching не работает для запросов из веб-воркеров и WebSocket. Для полного контроля над трафиком (корпоративные прокси) корпоративная политика Chrome до сих пор разрешает MV2, но публичный Chrome Web Store его не принимает.

Почему declarativeNetRequest быстрее webRequest?

Основное отличие — нативная обработка правил браузером без участия JavaScript. WebRequest требует синхронной обработки каждого запроса в расширении, что задерживает ответ и ухудшает TTFB. declarativeNetRequest обрабатывает правила на уровне сетевого стека, что снижает LCP на 10–20% в типовых кейсах.

Характеристика webRequest (MV2) declarativeNetRequest (MV3)
Модификация тела Да (через blocking) Нет
Производительность Ниже (JS-обработка) Выше (нативный браузер)
Безопасность Ниже (потенциальный XSS) Выше (изолированные правила)
Динамические правила Через listener updateDynamicRules
Редиректы с подстановкой Да Да (regexSubstitution)

Дополнительная таблица: когда применять статические и динамические правила

Тип правил Когда использовать Пример
Статические Фиксированные сценарии, не требующие частого изменения Блокировка известных трекеров, модификация заголовков корпоративных сервисов
Динамические Конфигурация меняется: включение/отключение по запросу пользователя, временные токены Переключение между staging и production, добавление авторизации с ограниченным сроком жизни

Какие ограничения у declarativeNetRequest?

Кроме лимита на количество правил (5 000 включённых), важно помнить: динамические правила можно добавлять только из service worker, а не из popup или content script. Также все правила должны быть объявлены заранее — нельзя сгенерировать правило на основе произвольного JS-вычисления. Для отладки используйте chrome.declarativeNetRequest.getMatchedRules() и testMatchOutcome(). Эти методы помогут проверить, какое правило сработает для конкретного URL, и выявить конфликты.

Что входит в нашу реализацию

  • Архитектура: проектирование системы правил (статические + динамические) с учётом лимитов MV3.
  • Content scripts: monkey-patching для модификации тела запросов, если необходимо.
  • Отладка: тестирование правил через testMatchOutcome, логирование срабатываний.
  • Документация: описание всех правил, схемы перенаправлений.
  • Поддержка: сопровождение после запуска, обновление при изменении API.

Процесс работы

  1. Аналитика — изучаем структуру запросов вашего приложения, выявляем цели перехвата.
  2. Проектирование — создаём спецификацию правил, согласовываем с вами.
  3. Реализация — пишем код расширения, включая service worker и content scripts.
  4. Тест — проверяем на реальных сценариях, отлавливаем edge cases.
  5. Деплой — публикуем в Chrome Web Store (или корпоративный реестр).

Сроки и гарантии

Срок разработки — от 5 до 15 рабочих дней в зависимости от сложности. Мы гарантируем стабильную работу и соответствие политикам Chrome Web Store. Опыт — более 50 проектов по браузерным расширениям.

За подробной информацией обращайтесь к официальной документации declarativeNetRequest. Получите консультацию по вашему проекту — свяжитесь с нами для обсуждения.

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1394
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1369
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1141
  • Разработка веб-сайта для компании ФИКСПЕР
    Разработка веб-сайта для компании ФИКСПЕР
    1060