CSP (Content Security Policy): что это и зачем нужен

CSP — HTTP-заголовок безопасности, запрещающий выполнение посторонних скриптов и загрузку ресурсов с чужих сайтов. Защищает от XSS-атак.

безопасностьcspxssзаголовкиweb-security

Что такое CSP

Content Security Policy (CSP) — HTTP-заголовок безопасности, который позволяет веб-сайту указать браузеру, с каких источников разрешено загружать ресурсы: скрипты, стили, изображения, шрифты, фреймы и др.

CSP — основная защита от XSS (Cross-Site Scripting) атак — одной из наиболее распространённых уязвимостей веб-приложений. Если злоумышленник внедрит вредоносный скрипт через форму или комментарий, CSP запретит браузеру его выполнить.

CSP поддерживается всеми современными браузерами. Внедрён в виде стандарта W3C.

Зачем нужен CSP

Защита от XSS: CSP блокирует выполнение inline-скриптов и скриптов с неразрешённых доменов.

Защита от clickjacking: директива frame-ancestors запрещает вставку сайта в iframe на чужих доменах.

Контроль загрузки ресурсов: предотвращает загрузку данных на сторонние серверы.

Отчётность: CSP умеет отправлять отчёты о нарушениях политики на ваш сервер.

SEO: Google учитывает безопасность сайта при ранжировании. CSP — часть общей безопасности.

Как настроить CSP

Базовая политика

Content-Security-Policy: default-src 'self'; script-src 'self' cdn.example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:;

Основные директивы

default-src — источник по умолчанию для всех ресурсов:

default-src 'self'

script-src — источники JavaScript:

script-src 'self' https://cdn.example.com 'nonce-abc123'

style-src — источники CSS:

style-src 'self' https://fonts.googleapis.com 'unsafe-inline'

img-src — источники изображений:

img-src 'self' data: https://cdn.example.com

font-src — источники шрифтов:

font-src 'self' https://fonts.gstatic.com

frame-ancestors — кто может встраивать в iframe:

frame-ancestors 'none'

connect-src — источники для XHR, WebSocket, Fetch:

connect-src 'self' https://api.example.com

Значения источников

| Значение | Описание | |----------|----------| | 'self' | Только текущий домен | | 'none' | Запрещено полностью | | 'unsafe-inline' | Разрешить inline-скрипты/стили | | 'unsafe-eval' | Разрешить eval() | | https: | Любой HTTPS источник | | https://example.com | Конкретный домен |

Nginx конфигурация

add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'nonce-$request_id'; style-src 'self' 'unsafe-inline';" always;

Режим отчётов (без блокировки)

Для тестирования политики без блокировки ресурсов:

Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report

Проверка CSP на reChecker

Используйте CSP Analyzer для анализа политики безопасности. Инструмент покажет:

  • Наличие заголовка CSP
  • Список всех директив и их значений
  • Потенциально опасные настройки (unsafe-inline, unsafe-eval)
  • Рекомендации по ужесточению политики

FAQ

CSP ломает мой сайт — что делать? Используйте режим Content-Security-Policy-Report-Only для тестирования без блокировки. Смотрите ошибки в консоли браузера и добавляйте нужные источники в политику постепенно.

Нужен ли CSP для статического сайта? Да, особенно если сайт принимает пользовательский ввод. Даже статические сайты через CDN могут подвергаться атакам через заражённые сторонние скрипты.

unsafe-inline — это плохо? Это ослабляет защиту CSP, так как разрешает inline-скрипты. Лучшая практика — использовать nonce (одноразовые токены) или hash для конкретных inline-блоков вместо глобального unsafe-inline.

Попробуйте инструмент

Проверьте csp (content security policy) на вашем сайте с помощью бесплатного инструмента.

CSP Analyzer

Техническая поддержка

Нашли баг, сбой или ошибку в работе сервиса? Есть предложение по улучшению? Напишите нам — мы читаем каждое сообщение и стараемся быстро исправлять проблемы.