Content Security Policy (CSP)
CSP — это страховка на случай, если экранирование где-то пропустили: браузер сам откажется исполнять чужой код.
Content Security Policy (CSP) — политика безопасности контента: HTTP-заголовок, который указывает браузеру, из каких источников разрешено загружать и исполнять скрипты, стили и другие ресурсы.
Экранирование — первый слой защиты от XSS, но люди ошибаются. CSP — второй, независимый слой (вспомните defense in depth). Даже если вредоносный скрипт как-то попал на страницу, браузер с правильной CSP откажется его выполнять.
Как работает CSP
Сервер присылает заголовок Content-Security-Policy с директивами. Каждая директива — белый список источников для своего типа ресурсов. Если ресурс не из списка, браузер его блокирует.
Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none'| Директива | Что ограничивает |
| default-src | источник по умолчанию для всех ресурсов |
| script-src | откуда можно грузить и исполнять скрипты |
| style-src | источники стилей |
| img-src | источники изображений |
| object-src | плагины (обычно 'none') |
Запрет inline-кода
Главная сила CSP против XSS — возможность запретить inline-скрипты (код прямо в разметке). Большинство XSS полагается именно на inline-исполнение, и без 'unsafe-inline' в политике браузер его не запустит. Поэтому inline-обработчики событий и встроенные скрипты выносят во внешние файлы.
Режим отчётов
CSP можно сначала включить в режиме Content-Security-Policy-Report-Only: браузер не блокирует, но шлёт отчёты о том, что было бы заблокировано. Так вы обкатываете политику, не ломая сайт, а потом включаете блокировку.
Как защищаться
- Начните с
default-src 'self'и сужайте список источников под реальные нужды. - Избегайте
'unsafe-inline'и'unsafe-eval'— они открывают то, что CSP должна закрыть. - Выносите inline-скрипты и обработчики во внешние файлы.
- Обкатывайте политику в Report-Only, затем включайте блокировку.
- Помните: CSP дополняет экранирование, а не заменяет его.
Частые ошибки разработчиков
- Добавляют
'unsafe-inline', чтобы «сайт заработал», и сводят защиту на нет. - Считают CSP заменой экранированию — это второй слой, а не первый.
- Ставят слишком широкую политику (разрешают всё), которая ничего не ограничивает.
Итог
- CSP — заголовок с белым списком источников ресурсов, второй слой защиты от XSS.
- Главное — запрет inline-исполнения (без 'unsafe-inline').
- Обкатывайте в Report-Only; CSP дополняет, но не заменяет экранирование.