Как 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:
- Хук мира MAIN перехватывает запись
console.log. - Сериализует аргументы и вызывает
window.postMessageс помеченным payload. - Контент-скрипт ISOLATED слушает
message, фильтрует по метке и рендерит запись в окне Output Console.
postMessage — один из немногих каналов, пересекающих границу миров — и делает это, не нарушая CSP, потому что это не выполнение скрипта, только передача сообщений.
Что это значит на практике
Output Console и внедрение JS работают на страницах, где классический трюк с inline-скриптом провалился бы — GitHub, банковские дашборды, корпоративные интранеты с жёсткой CSP. Ты ничего не настраиваешь; расширение само выбирает этот путь.
Ограничения — чего CSP всё равно не позволит
- Загружать внешние скрипты из твоего кода. Если твой внедрённый JS пытается добавить
<script src="https://cdn...">, этот новый тег остаётся под действием CSP страницы. - fetch к заблокированным доменам. Директива
connect-srcпо-прежнему ограничивает, куда код страницы может отправлять запросы. - Это не обход безопасности. Это работает, потому что пользователь сознательно установил расширение и дал ему права — это привилегия, которую ты дал сам, не дыра.
Обновление v3.2.0 — правила, действия и окна TEMP тоже
Описанный выше механизм касался хука Output Console — того, как расширение слушает console.log страницы. Выполнение твоих JS-правил, действий и окон TEMP JS — это отдельный путь, и он тоже когда-то работал только на страницах, чья CSP разрешала 'unsafe-eval'. В v3.2.0 мы перенесли ту же «многослойную стратегию» и на этот второй путь: порядок попыток — chrome.userScripts.execute → new Function → <script src="blob:…">. Правила, действия и панель JS / JS Console теперь работают даже на Facebook (через blob-фолбэк) и на сайтах со строгой CSP (через userScripts после одноразового согласия «Allow user scripts»). Полное описание: JavaScript-правила JustZix теперь работают даже на Facebook, X и GitHub.
Смотри также
- Output Console ловит ошибки — что видит хук
- Output Console — окно, в которое попадают логи
- window.JZ helpers — программный API
Установи JustZix — и внедряй код даже там, где страница говорит «нет».
Оцени эту статью
Оценок пока нет — оцени первым.