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 дополняет, но не заменяет экранирование.
Проверьте себя
1. Что делает Content Security Policy?
AШифрует трафик
BУказывает браузеру, из каких источников можно загружать и исполнять ресурсы
CХранит пароли
DУскоряет загрузку страницы
2. Почему 'unsafe-inline' в CSP — плохая идея?
AЗамедляет сайт
BРазрешает inline-скрипты, на которых держится большинство XSS, сводя защиту на нет
CЛомает изображения
DТребует больше памяти