Content-Security-Policy (CSP): защита от XSS
Что такое заголовок CSP, как его настроить, как избавиться от 'unsafe-inline' и безопасно протестировать в режиме Report-Only.
Что такое CSP
Content-Security-Policy сообщает браузеру, из каких источников страница может загружать скрипты, стили, изображения и фреймы. Даже если злоумышленнику удалось внедрить вредоносный скрипт (XSS), CSP может помешать его выполнению.
Базовая политика
HTTP
Content-Security-Policy: default-src 'self'; img-src 'self' data:; object-src 'none'; base-uri 'self'; frame-ancestors 'self'- default-src 'self' — всё только с вашего домена.
- object-src 'none' — запрещает загрузку кода через плагины.
- base-uri 'self' — нельзя подменить адреса через тег <base>.
- frame-ancestors 'self' — сайт нельзя встроить во фрейм чужого сайта (clickjacking).
Самые частые ошибки
- 'unsafe-inline' разрешает inline-скрипты и сводит на нет главную цель CSP. Используйте nonce или hash.
- 'unsafe-eval' и * (звёздочка) — почти не дают защиты.
- Разрешение https: или data: в script-src — значит можно грузить скрипты с любого HTTPS-сайта.
Безопасное внедрение
Сначала проверьте политику с заголовком Content-Security-Policy-Report-Only: посмотрите нарушения в консоли браузера и добавьте нужные источники. Когда всё работает, переименуйте заголовок в Content-Security-Policy.
SecScan в глубокой проверке анализирует CSP и перечисляет слабые места (unsafe-inline, wildcard, общие CDN-хосты).