Расширение для Chromium (Manifest V3): защита от слежки за фокусом и вкладкой, анти‑фингерпринт, сетевые и «устройственные» модули, оповещения о подозрительных страницах и полноценная страница параметров (public/options.html, в манифесте — options_page): исключённые домены, все модули, статистика, доступность. Во всплывающем окне действий — быстрые переключатели и ссылка «Все настройки…».
Версия: см. поле "version" в manifest.json.
Исходный код и обновления: https://github.com/ppvikentiy/security-browser-ex
Лицензия: MIT
- Блокирует типичные сигналы «ушёл с вкладки / потерял фокус»:
visibilitychange(включая vendor‑варианты),blur/focus/focusin/focusout - Подменяет чтение
document.hidden,visibilityStateи связанных полей так, чтобы страница «видела» вкладку как всегда активную (когда модуль включён) - Ограничивает
addEventListener/removeEventListener/dispatchEventдля перечисленных типов событий и inline‑обработчикиwindow.onfocus/window.onblur/document.onvisibilitychange— только пока соответствующий тип события включён в списке блокировки - Жёсткая подмена (lifecycle) — отдельный переключатель в настройках (
focusBlockingStrict, по умолчанию выключен): к вашему списку событий добавляютсяfreeze,resume,pagehide,pageshow, с подавлением связанных inline‑свойств (window.onpageshow,window.onpagehide,document.onfreeze,document.onresumeпри поддержке в браузере). Может мешать SPA и восстановлению страницы из bfcache
- Попап и глобальное включение — один переключатель «всё расширение», отдельно Focus Blocker, анти‑фингерпринт и Network Security; пауза только для текущей вкладки; быстро добавить сайт в исключения
- Анти‑фингерпринт (Security) — подмена в JS и через заголовки запросов: экран/окно, батарея, CPU/память,
matchMedia, WebGL, шум Canvas, часовой пояс,navigator/ User‑Agent / Client Hints, языки иAccept-Language, allowlist шрифтов; режимы отпечатка (per domain / session / random) - Network Security — блокировка запросов из страницы к localhost, частным и link‑local сетям (через Declarative Net Request), опционально жёсткая политика WebRTC против утечки IP (
chrome.privacy.network.webRTCIPHandlingPolicy) - Privacy pack — отдельный набор DNR‑правил под короткий список трекер‑доменов (узкий или широкий набор типов ресурсов); не смешивается с косметикой ADS Block
- Изоляция (
chrome.privacy) — глобально: отключение Referer, hyperlink auditing (<a ping>), network prediction/prefetch; см. предупреждения в настройках (SSO, оплаты, CDN) - Device Security — жёсткое ограничение
localStorage/sessionStorage, IndexedDB, Cache API; сокрытиеmediaDevicesиgeolocation; режим lockdown дескрипторов - Threat Shield («Активная интернет защита» в настройках) — локальное предупреждение поверх страницы (основной фрейм) при срабатывании эвристик: не‑HTTPS для публичных хостов, совпадение с встроенным или пользовательским списком «подозрительных» шаблонов хостов, похожие на фишинг многослойные TLD, опционально «мусорная» форма FQDN, цепочка HTTP‑редиректов до документа; белый список и дополнительные паттерны в настройках; текст баннера задан в
src/threat-shield.js - ADS Block (ранее модуль DS Block; код —
src/ds-block.js) — попапы без пользовательского жеста, косметическое скрытие по CSS (в т.ч. черезchrome.scriptingдля строгого CSP), блок телеметрии доменами через DNR; свои списки доменов и селекторов - Копирование — обход частых блокировок копирования; подсветка элемента и горячие клавиши (см. настройки раздела «Помощник при копировании»)
- Доступность — в параметрах можно уменьшить анимации и использовать более спокойный интерфейс (секция «Доступность»)
- Исключённые домены — шаблоны хостов (в т.ч.
*.example.com); на модули и часть DNR влияет список исключений; глобальныеchrome.privacyдля всего браузера от исключений не откатываются автоматически - Статистика — локальные суммы по домену верхнего окна: фокус, подмены FP, сеть в JS, DNR, устройство, ADS Block; при настроенном
declarativeNetRequestFeedback— учёт срабатываний правил DNR для бейджа и таблицы
После смены настроек перезагрузите страницу, где работают скрипты расширения.
- Скачайте архив репозитория: https://github.com/ppvikentiy/security-browser-ex (Code → Download ZIP), либо клонируйте этот репозиторий
- Распакуйте папку (если скачивали ZIP)
- Откройте
chrome://extensions/, включите «Режим разработчика» - «Загрузить распакованное расширение» → выберите корень проекта (папку, где лежит
manifest.json) - Параметры: из попапа ссылка «Все настройки…» или
chrome://extensions→ карточка расширения → «Просмотреть на странице параметров расширения» / пункт про расширенные настройки (зависит от версии браузера)
- Браузеры: Chromium 111+ (Chrome и совместимые сборки)
- Manifest: 3
- Сайты:
http/https(и см.match_about_blankв манифесте)
Ниже — как расширение взаимодействует с браузером и между своими частями. Это не публичный HTTP API для сторонних серверов; это внутренний контракт (Chrome Extension APIs, chrome.runtime.sendMessage, postMessage между мирами страницы).
| Разрешение | Зачем |
|---|---|
storage |
Настройки: основным хранилищем служит chrome.storage.local (при первом запуске возможна миграция из sync), сессионные карты в chrome.storage.session (пауза вкладки, косметический CSS, счётчики для бейджа) |
tabs, windows |
Активная вкладка в попапе, бейдж, хост для статистики |
scripting |
Вставка/снятие косметического CSS для ADS Block (insertCSS / removeCSS) |
declarativeNetRequest, declarativeNetRequestFeedback |
Динамические правила блокировки/подмены заголовков; опционально onRuleMatchedDebug для статистики DNR |
privacy |
WebRTC policy, Referer / ping / network prediction |
host_permissions *://*/* |
Условия DNR и работа с вкладками на обычных сайтах |
При runtime.onInstalled, runtime.onStartup и при изменении релевантных ключей в storage вызывается reloadFromStorageSnapshot():
- Подмена заголовков User-Agent и Client Hints — правило
modifyHeaders(id990001), если включены расширение, Security и флаг Navigator/UA; при ошибке Chromium применяется стратегия «полный набор → урезанный → только User-Agent» - Accept-Language — отдельное правило
modifyHeaders(id990002), если включены Security и Languages - Сетевые блокировки — до 12 правил
blockсregexFilterна localhost / RFC1918 / link-local / ULA IPv6 для типов ресурсов безmain_frame/sub_frame, чтобы не ломать прямой заход на LAN‑страницы - ADS Block телеметрия — блок доменами пакетами по 40 доменов на правило, слоты с
990060 - Privacy pack — аналогично, слоты с
990078, узкий или широкий наборresourceTypes - WebRTC —
chrome.privacy.network.webRTCIPHandlingPolicy.setилиclearв зависимости от Network Security - Изоляция —
referrersEnabled,hyperlinkAuditingEnabled,networkPredictionEnabledчерезchrome.privacy
Дополнительно учитываются ключи Threat Shield для перезагрузки снимка при смене настроек этого модуля.
Дополнительно:
- Пауза вкладки —
chrome.storage.session: ключfocusBlockerPausedTabIds({ [tabId]: true }), сброс при смене URL / закрытии вкладки - Косметика ADS Block — хранение CSS по
tabId, применение черезscriptingAPI - Статистика — ключ
focusBlockerStatsByHostвchrome.storage.local(см. миграцию изsyncвыше); инкремент из контента через сообщения и изdeclarativeNetRequest.onRuleMatchedDebugпри доступности - Бейдж — сумма полей счётчика активной вкладки в
focusBlockerTabStat(session)
Тип в поле type тела сообщения:
| Тип | Кто шлёт | Назначение |
|---|---|---|
FB_STATS_REPORT |
stats-bridge.js (изолированный мир) |
Передача deltas, breakdown, topHost для статистики и бейджа |
FB_DS_BLOCK_SET_COSMETIC_CSS |
settings-bridge.js, главный фрейм |
Включить/выключить инжект CSS скрытия для текущей вкладки |
FB_IS_TAB_PAUSED |
settings-bridge.js |
Узнать, стоит ли пауза на этой вкладке |
FB_POPUP_GET_STATE |
popup.js |
Хост, флаги настроек, исключения, injectable, paused |
FB_POPUP_SET_TAB_PAUSE |
popup.js |
Поставить/снять паузу для активной вкладки |
FB_POPUP_SET_STORAGE_BOOL |
popup.js |
Запись extensionGloballyEnabled, focusBlockingEnabled, securityEnabled, networkSecurityEnabled и др. |
FB_POPUP_ADD_HOST_EXCLUSION |
popup.js |
Добавить текущий хост в excludedDomains |
Ответы асинхронные (return true в listener где нужен sendResponse).
Читает chrome.storage, учитывает исключения домена, глобальное включение, паузу вкладки и рассылает в основной мир страницы через window.postMessage и дублирующие CustomEvent:
type в postMessage |
Назначение |
|---|---|
FOCUS_BLOCKER_SETTINGS |
Списки событий фокуса и флаг «модуль включён» для content.js |
FOCUS_BLOCKER_SECURITY_SETTINGS |
Сведения Security + URL worker для тяжёлых патчей |
FOCUS_BLOCKER_NETWORK_SETTINGS |
Флаги Network Security для network-security.js |
FOCUS_BLOCKER_DS_BLOCK_SETTINGS |
ADS Block (legacy имя сообщения DS Block) |
FOCUS_BLOCKER_DEVICE_SECURITY_SETTINGS |
Device Security |
FOCUS_BLOCKER_THREAT_SHIELD_SETTINGS |
Threat Shield: объединённые настройки и встроенные списки паттернов / хвостов TLD |
MAIN-скрипт может запросить переотправку: FOCUS_BLOCKER_REQUEST_SETTINGS (ответ подтверждается FOCUS_BLOCKER_SETTINGS_ACK).
Кэш в localStorage (__focus_blocker_*_cache_v1) используется как запасной путь до прихода настроек с моста (в том числе __focus_blocker_threat_shield_cache_v1 для Threat Shield).
В изолированный мир уходит postMessage с типом FOCUS_BLOCKER_STATS_DELTA (deltas, breakdown, topHost), оттуда — FB_STATS_REPORT в service worker.
src/content.js— Focus Blocker в MAINsrc/security.js,src/security-worker.js— анти‑фингерпринтsrc/network-security.js— перехваты fetch/XHR/WebSocket и др. в рамках настроекsrc/device-security.js— API устройства и хранилищsrc/ds-block.js— ADS Block: попапы, телеметрия, косметика (совместно с background)src/copy-helper.js— копированиеsrc/threat-shield.js— баннер и эвристики Threat Shield (в манифесте подключён только к главному фрейму страницы,all_frames: false)
MIT. Подробности — в файле LICENSE.