В расширениях Chrome существуют различные способы реализации фильтрации контента и сети. В этом руководстве представлен обзор возможностей фильтрации контента, доступных расширениям, а также различных подходов, методов и API-интерфейсов фильтрации, которые могут использоваться расширениями Chrome.
Фильтрация сетевых запросов
Основной способ фильтрации сетевых запросов в расширениях Chrome — использование API chrome.declarativeNetRequest . С помощью DeclarativeNetRequest разработчики могут блокировать или изменять сетевые запросы, указывая декларативные правила. Формат правил DeclarativeNetRequest основан на возможностях синтаксиса списков фильтров, используемого большинством блокировщиков рекламы.
Эти правила позволяют:
- Заблокировать сетевой запрос.
- Обновите схему URL-адресов до защищенной (с http на https или с ws на wss).
- Перенаправить сетевой запрос.
- Изменяйте заголовки запроса или ответа.
Chrome поддерживает правила, встроенные в расширение, а также правила, обновляемые динамически (например, в ответ на удаленную конфигурацию или ввод пользователя).
Объедините правила фильтрации с вашим расширением.
Правила, включенные в пакет расширения, называются «статическими правилами». Эти правила устанавливаются и обновляются при установке или обновлении расширения. Chrome ограничивает количество статических правил, которые может объявить расширение.
Для статических правил Declarative Net Request Chrome имеет глобальный общий пул из 300 000 правил, которые могут использоваться совместно установленными расширениями. Кроме того, каждому расширению гарантировано 30 000 статических правил. Например, если у пользователя установлено только одно расширение для фильтрации контента, оно может использовать до 330 000 статических правил Declarative Net Request. Чтобы представить себе это количество, популярный список фильтров EasyList , используемый большинством блокировщиков рекламы, состоит примерно из 35 000 сетевых правил.
Статические декларативные правила сетевого запроса могут быть организованы в различные наборы правил. Расширение может задавать до 100 статических наборов правил, и одновременно может быть включено 50 из этих наборов правил.
Динамическое добавление правил фильтрации во время выполнения.
Некоторые правила нельзя включить в состав расширения. Вместо этого расширениям необходимо добавлять их во время выполнения. Такие правила называются «динамическими правилами».
Для динамических правил Declarative Net Request Chrome допускает максимум 30 000 безопасных динамических правил на одно расширение. Большинство правил считаются безопасными: block , allow , allowAllRequests или upgradeScheme . Даже если правило не считается безопасным (например, redirect ), его все равно можно добавлять динамически, но с меньшим максимальным лимитом в 5000, который также учитывается в лимите в 30 000 динамических правил. Для сравнения, 98-99% правил в списке фильтров easylist являются безопасными .
Расширения для фильтрации контента могут использовать статические и динамические правила соответственно, чтобы объединять известные правила фильтрации со своим расширением и обновлять свои расширения новыми правилами фильтрации контента со своих серверов по мере необходимости.
Адаптируйте правила на основе наблюдаемых запросов.
Рекламная экосистема постоянно развивается, и контентные фильтры необходимо соответствующим образом обновлять. Комбинируя chrome.webRequest и динамические правила декларативных сетевых запросов, можно анализировать сетевые запросы на предмет потенциальных нарушений конфиденциальности и блокировать их в будущем.
Основной подход таков:
- Проанализируйте веб-запросы с помощью API
chrome.webRequestи попытайтесь автоматически выявить запросы, не соответствующие вашим требованиям конфиденциальности, например, используя машинное обучение. - Создайте динамическое правило Declarative Net Request для каждого запроса, выявленного на втором шаге, чтобы аналогичные запросы блокировались в будущем.
- (Необязательно) Отправьте найденное правило декларативного сетевого запроса обратно на ваш сервер, чтобы его можно было добавить в качестве статического правила декларативного сетевого запроса при следующем обновлении вашего расширения.
Преимущество такого подхода заключается в том, что анализ проводится асинхронно и не окажет негативного влияния на производительность веб-сайта.
Предоставьте пользователям возможность определять собственные правила фильтрации.
Вы можете позволить пользователям определять собственные правила фильтрации контента, предоставив пользовательский интерфейс для настройки фильтров в вашем расширении. Преобразуйте эти определяемые пользователем правила в декларативные правила Net Request и добавьте их в качестве динамических правил . Эти правила будут оставаться доступными для пользователей, поскольку они сохраняются между сеансами браузера и обновлениями расширения. Используя этот подход, пользователи могут добавить до 30 000 пользовательских правил.
Фильтрация элементов на веб-страницах
Фильтрация сетевых запросов — лишь одна важная часть фильтрации контента. Другая важная часть — удаление ненужного контента непосредственно с веб-страниц. Например, более 40% правил фильтрации easylist определяют, как клиенты должны скрывать элементы страницы.
Этого можно достичь с помощью скриптов контента . Скрипты контента выполняются в контексте веб-страниц и могут вносить в них изменения, используя DOM.
Расширения Chrome не могут выполнять удаленно размещенный код . Однако данные с сервера о том, какие элементы следует скрывать, не затрагиваются, поскольку это считается данными конфигурации, поэтому правила для элементов можно обновлять во время выполнения при необходимости.
Фильтрация сетевых запросов в расширениях, установленных в рамках политики.
В корпоративных и образовательных приложениях часто предъявляются чрезвычайно строгие требования к фильтрации контента и сети, например, к фильтрации запросов на основе их содержимого. Для реализации таких сценариев расширения, устанавливаемые с помощью политик, предоставляют дополнительный способ фильтрации и блокировки сетевых запросов. Используя опцию «блокировка» с событиями в API webRequest , можно реализовать программный фильтр контента, который выполняет пользовательскую логику для каждого запроса, чтобы решить, следует ли блокировать запрос или нет. Это доступно только для расширений, устанавливаемых с помощью политик, поскольку они обладают более высоким уровнем доверия.
Перехват навигационных запросов
Запросы навигации можно фильтровать с помощью правил Declarative Net Request. Например, вы можете захотеть обойти URL-адреса отслеживания, которые перенаправляют пользователя на нужную страницу. Один из подходов к решению этой проблемы — перенаправить запрос навигации https://tracker.com?redirect=https%3A%2F%2Fexample.com на страницу расширения (которая должна быть настроена как веб-доступный ресурс ), которая затем запустит скрипт для извлечения целевого адреса перенаправления и перенаправит пользователя на нужную страницу, используя window.location.replace("https://example.com") минуя трекер ссылок.