← Все статьи

API и хелперы

Как JustZix внедряет код на страницах со строгой CSP

У некоторых страниц настолько строгая Content-Security-Policy, что они не выполняют ни одного скрипта, который не написал их автор. И всё же JustZix может внедрить туда твой JS и подключить Output Console к console.log страницы. Эта статья объясняет как — и почему первая версия не могла.

Что такое CSP и почему она мешает

Content-Security-Policy — это HTTP-заголовок, которым страница объявляет, откуда могут загружаться скрипты. Типичная строгая политика — script-src 'self' — «выполняй только скрипты с моего домена». Такая политика блокирует inline-<script>: если ты внедришь тег <script>код...</script> в DOM, браузер его не выполнит. Так работают GitHub, банковские дашборды и многие корпоративные сайты.

Первый подход — и регрессия

Ранняя версия хука Output Console (v2.13.72–73) внедряла код именно через inline-<script>, добавленный в <head>. На обычных страницах это работало. На страницах со script-src 'self' браузер молча отклонял скрипт — хук никогда не подключался, Output Console оставалась пустой. Это была регрессия: функция, работавшая «в демо», падала ровно там, где она разработчику нужнее всего.

Исправление — chrome.scripting.executeScript

Решение (v2.13.74) больше не внедряет тег <script>. Вместо этого service worker расширения вызывает chrome.scripting.executeScript. В этом ключевая разница: этот скрипт выполняется с привилегией расширения, не на уровне страницы. CSP страницы к нему не применяется — браузер обращается с ним как с кодом доверенного расширения, на установку которого пользователь согласился.

Мир MAIN против мира ISOLATED

Контент-скрипты расширения по умолчанию живут в «изолированном мире» (ISOLATED) — у них свой window, отдельный от страницы. Это безопасно, но бесполезно, когда ты хочешь подключиться к настоящему console.log страницы или коснуться её глобальных переменных.

Поэтому хук попадает в мир MAIN — тот же JavaScript-контекст, в котором живёт код страницы. Там он может обернуть console.log/warn/error, подключить слушатели error и unhandledrejection и видеть ровно то, что видит страница.

Мост между мирами — postMessage

Хук в мире MAIN ловит логи, но само окно Output Console рендерится контент-скриптом в мире ISOLATED. Два мира не разделяют переменные — нужен мост. Этот мост — window.postMessage:

  1. Хук мира MAIN перехватывает запись console.log.
  2. Сериализует аргументы и вызывает window.postMessage с помеченным payload.
  3. Контент-скрипт ISOLATED слушает message, фильтрует по метке и рендерит запись в окне Output Console.

postMessage — один из немногих каналов, пересекающих границу миров — и делает это, не нарушая CSP, потому что это не выполнение скрипта, только передача сообщений.

Что это значит на практике

Output Console и внедрение JS работают на страницах, где классический трюк с inline-скриптом провалился бы — GitHub, банковские дашборды, корпоративные интранеты с жёсткой CSP. Ты ничего не настраиваешь; расширение само выбирает этот путь.

Ограничения — чего CSP всё равно не позволит

Обновление v3.2.0 — правила, действия и окна TEMP тоже

Описанный выше механизм касался хука Output Console — того, как расширение слушает console.log страницы. Выполнение твоих JS-правил, действий и окон TEMP JS — это отдельный путь, и он тоже когда-то работал только на страницах, чья CSP разрешала 'unsafe-eval'. В v3.2.0 мы перенесли ту же «многослойную стратегию» и на этот второй путь: порядок попыток — chrome.userScripts.executenew Function<script src="blob:…">. Правила, действия и панель JS / JS Console теперь работают даже на Facebook (через blob-фолбэк) и на сайтах со строгой CSP (через userScripts после одноразового согласия «Allow user scripts»). Полное описание: JavaScript-правила JustZix теперь работают даже на Facebook, X и GitHub.

Смотри также

Установи JustZix — и внедряй код даже там, где страница говорит «нет».

Оцени эту статью

Оценок пока нет — оцени первым.

Попробуй сам

Установи JustZix и вставь любой сниппет из этой статьи. Две минуты от нуля до работающего правила на всех твоих устройствах.

Получить JustZix

Возможности · Как это работает · Примеры · Применение