Content Security Policy (CSP) ограничивает, откуда на сайт можно загружать скрипты, стили, frame и мультимедиа, тем самым снижая риск XSS и других внедрений кода. Она не лечит уязвимый бэкенд, но добавляет мощный второй контур защиты, особенно в связке с код‑ревью и WAF.
Что нужно помнить о CSP для защиты от инъекций
- CSP не заменяет исправление XSS, а уменьшает последствия и усложняет эксплуатацию уязвимостей.
- Главный эффект даёт отказ от inline‑скриптов и переход на nonce или hash‑based подход.
- Начинайте с режима report-only, чтобы не ломать продакшн и собирать отчёты.
- Список разрешённых источников должен быть минимальным и регулярно пересматриваться.
- CSP эффективнее всего в комплексе: web application firewall и CSP комплексная защита сайта дополняют друг друга.
- Неправильная настройка способна как не защитить от атак, так и «сломать» легальный функционал.
Как работает Content Security Policy: ключевые механизмы и директивы
Content Security Policy — это политика, которую браузер применяет к загружаемому контенту. Сервер отправляет HTTP‑заголовок Content-Security-Policy (или мета‑тег), а браузер проверяет каждую попытку загрузить скрипт, стиль, изображение, XHR, frame или других ресурсов на соответствие этой политике.
Ядро CSP — набор директив и источников. Директива определяет тип ресурса (script-src, style-src, img-src, connect-src, frame-ancestors и др.), а список источников задаёт, откуда разрешено грузить: собственный домен ('self'), конкретные домены, схемы (https:), а также специальные токены ('none', 'unsafe-inline', 'unsafe-eval' и т.д.).
Для защиты от внедрения вредоносного кода критичны директивы default-src, script-src, style-src, frame-src, frame-ancestors. Они задают «периметр» для выполнения скриптов и встраивания внешних документов. Вместо разрешения произвольного JavaScript‑кода CSP поощряет использование nonce и hash для явного белого списка разрешённых фрагментов.
Примеры базовых политик:
Content-Security-Policy: default-src 'self';
script-src 'self' https://cdn.example.com;
style-src 'self' 'unsafe-inline';
img-src 'self' data:;
Content-Security-Policy: default-src 'self';
script-src 'self' 'nonce-ABC123';
object-src 'none';
base-uri 'self';
frame-ancestors 'none';
Режим Content-Security-Policy-Report-Only включает те же правила, но вместо блокировки отправляет отчёты о нарушениях на указанный report-uri или report-to, что удобно для безопасной обкатки.
Векторы внедрения вредоносного кода и роль CSP в их нейтрализации
- XSS через пользовательский ввод. Уязвимый input попадает в HTML/JS без экранирования и превращается в произвольный скрипт. Жёсткий
script-srcбез'unsafe-inline'и безjavascript:вdefault-srcблокирует выполнение такого кода, если он не подписан корректным nonce/hash. - Инъекция через внешние скрипты. Злоумышленник добивается подмены или добавления внешнего файла JS. CSP ограничивает список доверенных доменов и запретит загрузку скрипта с неожиданного источника, даже если тег
<script>оказался в DOM. - Встраивание в iframe и clickjacking. Опасно, когда ваш сайт открывается внутри вредоносного контейнера. Директива
frame-ancestorsконтролирует, какие домены имеют право встраивать страницу, существенно уменьшая площадь атаки clickjacking и некоторых вариантов фишинга. - Инъекция через опасные схемы и inline‑обработчики.
javascript:в ссылках,onerrorу изображений и inline‑обработчики событий часто используются для XSS. CSP с запретом'unsafe-inline'и указанием только безопасных схем (например,https:) блокирует такие сценарии. - Подгрузка вредоносного контента из незащищённых источников. Загрузка ресурсов по
http:или с произвольных доменов может привести к подмене содержимого. Требованиеhttps:в директивах и ограниченный список доменов снижают риск MITM и инъекции на уровне сети. - Межсайтовые атаки через API‑запросы. Директива
connect-srcконтролирует, куда можно отправлять XHR/fetch/WebSocket‑запросы. Это уменьшает риск утечки данных на неожиданные домены при успешном частичном XSS.
Проектирование политики: выбор директив, источников и уровней жёсткости
Продуманная content security policy настройка для сайта начинается с инвентаризации фронтенда: какие домены используются для скриптов, стилей, карт, аналитики, файлов. На основе этого формируется минимальный белый список для каждой директивы, а всё лишнее по умолчанию блокируется.
- Базовый профиль «только свой домен». Подходит простым сайтам без сторонних виджетов:
Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; object-src 'none'; base-uri 'self';Такой профиль уже защищает от большинства простых XSS‑инъекций и загрузки посторонних ресурсов.
- Профиль для SPA с внешним CDN. Здесь нужны скрипты и стили с конкретного CDN, а также API‑домен:
script-src 'self' https://cdn.example.com; style-src 'self' https://cdn.example.com; connect-src 'self' https://api.example.com;Важно не использовать шаблоны вроде
*.example.comбез необходимости, чтобы не расширять поверхность атаки. - Nonce‑ориентированный профиль для строгой защиты. Inline‑скрипты запрещены, разрешено только то, что подписано nonce:
script-src 'self' 'nonce-r4nd0m' https://cdn.example.com; style-src 'self'; object-src 'none';Сервер при каждом ответе генерирует случайный nonce и вставляет его и в заголовок, и в теги
<script nonce="...">. - Профиль для приложений с встраиванием. Если ваш сервис легально открывается в iframe партнёров, аккуратно настраивается
frame-ancestors, перечисляющий допустимые домены. Остальным сайтам встраивание запрещено. - Профиль для внутренних админок. Обычно допускает меньше внешних источников и дополнительно ограничивает
connect-srcтолько внутренними API, чтобы даже при частичном взломе атакующий не смог свободно отправлять данные наружу.
В реальных проектах часто подключают услуги по настройке политики безопасности контента CSP и аудит безопасности сайта и внедрение content security policy, чтобы аккуратно пройти путь от мягкой политики к более строгой без простоев и поломок фронтенда.
Реальные ограничения CSP: обходные пути атак и совместимость с браузерами

Перед обсуждением ограничений важно понимать практические сценарии: CSP особенно полезна там, где у вас уже реализованы базовые меры (валидный output‑encoding, фильтрация ввода, безопасные шаблонизаторы), а также включён фильтр на периметре — например, web application firewall и CSP комплексная защита сайта как единый стек. В такой архитектуре CSP выступает как последний рубеж на стороне браузера.
- Преимущества CSP.
- Существенно усложняет эксплуатацию XSS, даже если уязвимость в коде ещё не устранена.
- Даёт чёткий, документируемый периметр доверенных источников и каналов связи с браузером.
- Помогает выявлять неожиданные внешние зависимости и «теневые» скрипты, появляющиеся в отчётах CSP.
- Хорошо сочетается с WAF: WAF фильтрует запросы, CSP контролирует поведение браузера на уровне ответа.
- Поддерживает режим
report-only, снижая риск внедрения на продакшн без предварительных тестов.
- Ограничения и слабые места.
- CSP не исправляет логические уязвимости и ошибки прав доступа; это не замена безопасной разработки.
- Некоторые типы XSS (например, через уже разрешённые скрипты) могут обойти политику, если она слишком широкая.
- Сложные приложения с большим количеством сторонних скриптов труднее перевести на строгий
script-srcбез'unsafe-inline'. - Часть старых браузеров поддерживает CSP частично или не поддерживает совсем; для них нужны дополнительные меры.
- Ошибки конфигурации (например, добавление
'unsafe-inline'«временно») фактически сводят защиту на нет.
Инструменты и методики тестирования, отладки и мониторинга CSP
Типичная дорожная карта включает локальную отладку, мягкое включение политики и постоянный мониторинг нарушений. Это в equal мере важно как при самостоятельной настройке, так и когда вы решаете не «csp защита от XSS внедрения кода купить решение», а внедрять политику своими силами.
- Режим report-only для безопасного старта. Сначала включите
Content-Security-Policy-Report-Onlyи задайтеreport-uriилиreport-to. Так вы увидите все нарушения в логах, не ломая функционал для пользователей. - Использование браузерных девтулз. Современные DevTools показывают нарушения CSP прямо в консоли и иногда предлагают подсказки по корректной настройке директив. Это позволяет быстро поймать проблемы в интеграции сторонних виджетов.
- Централизованный сбор и анализ отчётов. Направляйте отчёты CSP в отдельный endpoint, логируйте и агрегируйте их. Так можно заметить, например, внезапные попытки подгрузить скрипт с неизвестного домена, что станет сигналом для расследования.
- Автоматические тесты и регрессия. Добавьте проверки CSP в pipeline: тесты должны убедиться, что обязательные директивы присутствуют, а запрещённые токены (
'unsafe-inline','unsafe-eval') не появились обратно. - Периодический аудит политик. Регулярный аудит безопасности сайта и внедрение content security policy помогают удалить устаревшие исключения, сокращать белые списки и адаптировать политику под изменившийся фронтенд.
Практическая инструкция по поэтапному внедрению CSP в приложение
Ниже — минимальный безопасный план внедрения, который можно использовать как шаблон или основой для формализации внутренних процедур, либо для постановки задачи подрядчику, оказывающему услуги по настройке политики безопасности контента CSP.
- Инвентаризация ресурсов. Соберите список всех доменов и типов контента: скрипты, стили, картинки, шрифты, API, iframe. Это можно сделать через network‑лог браузера и через анализ кода.
- Черновая политика в report-only. На основе инвентаризации сформируйте политику с директивами
default-src,script-src,style-src,img-src,connect-src,frame-ancestorsи включите её вContent-Security-Policy-Report-Only. - Сбор и анализ отчётов. В течение нескольких дней/итераций разработки собирайте отчёты. Устраняйте легитимные нарушения (например, забытый домен аналитики), а подозрительные события расследуйте.
- Отказ от inline‑скриптов. Перенесите inline‑код в отдельные файлы или используйте nonce/hash. Цель — убрать
'unsafe-inline'изscript-srcи по возможности изstyle-src. - Постепенное ужесточение и включение боевого режима. Когда отчёты стабилизируются, переключите политику из report-only в боевой режим. Для высокорисковых страниц (логин, платёж) можно задать ещё более строгие политики.
- Интеграция с остальной защитой. Скоординируйте политику с WAF и другими мерами. Если вы уже используете web application firewall и CSP комплексная защита сайта планируется как единый проект, следите, чтобы блокировки не дублировались и не мешали друг другу.
Даже если вы привлекаете внешний сервис или подрядчика, а не внедряете политику сами, понимание этих шагов позволит грамотно сформулировать требования и контролировать качество результата.
Ответы на типичные вопросы и ошибки при настройке CSP
Заменяет ли CSP исправление XSS‑уязвимостей в коде?
Нет. CSP снижает вероятность успешной эксплуатации XSS и делает атаки дороже, но не исправляет исходный код. Уязвимости всё равно нужно устранять через корректный output‑encoding, фильтрацию ввода и безопасные шаблонизаторы.
Можно ли просто скопировать «чью‑то» политику и использовать у себя?
Нежелательно. Политика жёстко завязана на архитектуру и зависимости конкретного сайта. Чужая CSP почти наверняка сломает ваш функционал или оставит лишние дыры из-за слишком широких разрешений.
Обязательно ли отказываться от inline‑скриптов и стилей?
Для сильной защиты от внедрения кода — да, желательно. Можно временно оставить часть inline‑кода, но тогда CSP даст ограниченный эффект. Рекомендуется планово выносить скрипты в файлы или подписывать их nonce/hash.
Зачем начинать с режима report-only, если он не блокирует атаки?
Report-only позволяет безопасно понять, что именно сломается при включении боевой политики, и собрать статистику нарушений. Это снижает риск простоев и помогает постепенно довести политику до рабочего состояния.
Нужна ли CSP, если уже используется WAF и другие средства защиты?
Да, желательно. WAF контролирует входящие запросы, а CSP — поведение браузера на клиенте. Вместе они закрывают больше сценариев атак, чем каждое средство по отдельности.
Повлияет ли строгая CSP на SEO и индексацию сайта?

Обычно нет, если она не мешает загрузке необходимого контента и скриптов. Проблемы возникают только при ошибочной блокировке критически важных ресурсов, поэтому важны тестирование и анализ отчётов.
Можно ли полностью защититься от XSS только с помощью CSP?
Нет. CSP — важный, но вспомогательный слой. Полная защита от XSS требует сочетания безопасной разработки, код‑ревью, тестирования, WAF и других практик, а CSP дополняет их на стороне браузера.

