HTTP заголовки безопасности: CSP, HSTS и остальные
Что реально делают CSP, HSTS и другие HTTP заголовки безопасности, как их настроить и какую атаку блокирует каждый из них, без лишнего жаргона.
Команда rabbitclipПубликация: 4 мин чтения
Коротко
HTTP заголовки безопасности — это правила, которые веб-сервер добавляет к каждому ответу, сообщая браузеру, как себя вести. CSP ограничивает, из каких источников можно загружать скрипты и изображения, HSTS заставляет браузер всегда использовать зашифрованное соединение, а заголовки помельче, вроде X-Content-Type-Options и Referrer-Policy, закрывают риски, которые ничуть не менее реальны. Ни один не требует написания кода; хватает нескольких строк в конфигурации сервера или CDN.
Если сайт юридической фирмы запускает рекламный скрипт стороннего сервиса без правильно настроенного CSP, этот скрипт может внедрить в страницу почти любой код; на странице, где посетитель заполняет форму, этот риск отнюдь не абстрактный. Заголовки безопасности с самого начала ограничивают, что такой скрипт вообще способен сделать, и именно поэтому их стоит проверять не только на новом сайте, но и на уже работающем годами.
Что такое HTTP заголовок безопасности и как он работает?
HTTP заголовок безопасности — это дополнительная строка инструкции, которую сервер отправляет с каждым ответом; браузер читает её и соответственно ограничивает страницу. Заголовки не меняют содержимое страницы, только то, что браузеру разрешено с ним делать.
Их добавление не требует написания новой функции; достаточно нескольких строк в конфигурации Nginx, Apache, Cloudflare или такого фреймворка, как Next.js. После правильной настройки они автоматически уходят с каждым запросом страницы.
Что на самом деле делает Content-Security-Policy (CSP)?
CSP определяет, с каких адресов странице разрешено загружать скрипты, изображения, шрифты и стили. Согласно рекомендациям OWASP по HTTP заголовкам, CSP — единственный заголовок, который реально мешает выполнению кода, уже внедрённого в страницу; это делает его одной из самых эффективных защит от межсайтового скриптинга (XSS).
Сложная часть настройки, действительно перечислить каждый сторонний ресурс, который использует сайт, аналитику, сервис шрифтов, платёжного провайдера; пропуск одного из них ломает часть страницы. Поэтому CSP обычно сначала запускают в режиме только отчётов, изучают журналы, а затем переключают в ограничивающий режим, оставляя достаточно времени, чтобы заметить забытый домен раньше посетителей.
Что гарантирует HSTS (Strict-Transport-Security)?
HSTS говорит браузеру никогда больше не подключаться к сайту по незашифрованному http, инструкция сохраняется на стороне браузера, поэтому даже если посетитель наберёт http в адресной строке, соединение автоматически переключается на https. Это закрывает возможность понижения соединения до незашифрованного посередине пути, атаку посредника.
Рекомендуемая MDN настройка держит долгий max-age, около двух лет, охватывает и поддомены, и может быть отправлена в список предзагрузки; но перед включением в этот список каждый поддомен действительно должен работать по https, поскольку выйти из этого списка потом непросто, а браузеры с уже сохранённым правилом продолжат требовать шифрование ещё долго после отката.
Как настроить базовый набор заголовков
Для небольшого корпоративного сайта следующие пять заголовков разумная отправная точка; каждый закрывает свой риск.
- Content-Security-Policy: ограничивает, откуда можно загружать скрипты и ресурсы
- Strict-Transport-Security: держит соединение зашифрованным постоянно
- X-Content-Type-Options: nosniff, не даёт браузеру неправильно угадать тип файла
- Referrer-Policy: ограничивает, какая информация страницы утекает на другие сайты
- Permissions-Policy: ограничивает доступ к функциям браузера вроде камеры и геолокации
Как тестировать заголовки и держать их без ошибок
Неправильно настроенный заголовок может либо заметно сломать страницу, либо тихо отключить какую-то функцию; оба случая нужно тестировать до запуска. Консоль разработчика браузера напрямую показывает нарушения CSP; когда ресурс блокируется, консоль называет его и объясняет причину.
Изменения стоит сначала опробовать в тестовой среде, затем на боевой странице с низким риском; выкатывать их сразу на весь сайт значит рисковать сломать неожиданную стороннюю интеграцию.
Частые ошибки
Заголовки безопасности могут превратиться в настройку, которую один раз сделали и забыли; это приводит к поломке, которую никто не замечает, пока не добавят новую интеграцию.
- ослаблять CSP с помощью unsafe-inline, что во многом сводит на нет смысл заголовка
- добавлять HSTS в список предзагрузки без предварительного тестирования
- не обновлять список CSP при добавлении нового стороннего скрипта
- настраивать заголовки только на главной странице и забывать про остальной сайт
HTTP заголовки безопасности не меняют внешний вид сайта; они определяют, что браузеру разрешено с ним делать. Их настройка разовая задача, а вот поддержка нет. Первый разговор с rabbitclip хорошее место, чтобы проверить, какие заголовки реально есть у вашего сайта сегодня.
Частые вопросы
Влияют ли заголовки безопасности на SEO?
Не напрямую, но заголовки вроде HSTS, которые принуждают к HTTPS, служат косвенным положительным сигналом для поисковых систем, ценящих безопасные соединения.
Может ли настройка CSP сломать работающий сайт?
Да, при неправильной настройке. Сначала протестировать в режиме только отчётов и изучить журналы перед переключением в ограничивающий режим снижает этот риск.
Где настраиваются эти заголовки?
В конфигурации Nginx, Apache, Cloudflare или фреймворка вроде Next.js; синтаксис отличается, логика остаётся той же.
Действительно ли небольшому сайту нужны эти заголовки?
Да. Размер здесь не важен; любой сайт с формой, страницей входа или сторонними скриптами сталкивается с теми же базовыми рисками.
