Перейти к содержимому
Noroxi
Инфраструктура6 мин

Заголовки безопасности: десять уязвимостей, закрытых пятью строками

HSTS, CSP, X-Frame-Options и другие. Что блокирует каждый заголовок, какие настройки вызывают проблемы в продуктивной среде и как внедрять их поэтапно.

Правильная настройка заголовков HTTP-ответа — одно из самых недорогих улучшений безопасности веб-приложения. Несколько строк конфигурации существенно затрудняют целый класс атак на уровне браузера. Однако те же заголовки, настроенные неверно, способны нарушить работу продуктивной среды. В этой статье мы рассказываем, за что отвечает каждый заголовок и как внедрять их поэтапно.

Strict-Transport-Security (HSTS)

Сообщает браузеру: «подключайся к этому сайту только по HTTPS». После применения браузер отклоняет обычные HTTP-соединения при попытках перехвата трафика.

Обратите внимание: includeSubDomains и preload — мощные, но трудно отменяемые директивы. Не добавляйте includeSubDomains, пока не убедитесь, что все ваши поддомены работают по HTTPS. Начните с небольшого значения срока действия и увеличивайте его только после того, как убедитесь, что всё работает.

Content-Security-Policy (CSP)

Самый мощный заголовок и одновременно требующий наибольшей аккуратности. Он указывает браузеру, из каких источников разрешено загружать скрипты, стили и изображения. При правильной настройке CSP в значительной мере препятствует выполнению внедрённого скрипта.

Если сразу включить CSP в режиме принудительного применения, сайт перестанет работать корректно. Правильный путь таков:

  • Сначала выкатите политику в режиме, который только собирает отчёты.
  • По отчётам определите, какие ресурсы были бы заблокированы при реальном трафике.
  • Сузьте политику с учётом этих наблюдений.
  • Переходите в режим принудительного применения, лишь когда сайт работает без сбоев.

X-Frame-Options и frame-ancestors

Не позволяет скрытно встроить ваш сайт в чужую страницу, чтобы вынудить пользователя кликнуть не туда. Современный подход — обеспечивать ту же защиту директивой CSP frame-ancestors. Если передавать оба заголовка, будут охвачены как старые, так и новые браузеры.

X-Content-Type-Options

У этого заголовка единственное значение: он отключает попытки браузера угадать тип содержимого. В ряде случаев такое угадывание приводит к неверной интерпретации вредоносного содержимого. Побочных эффектов практически нет, заголовок можно применять без опасений.

Referrer-Policy и Permissions-Policy

Referrer-Policy определяет, какой объём сведений об адресе передаётся при переходе на другие сайты. Permissions-Policy ограничивает доступ к возможностям браузера, таким как камера и геолокация. Оба заголовка сужают поверхность, значимую для конфиденциальности, и несут низкий риск.

План поэтапного внедрения

  1. Начните с заголовков без побочных эффектов: X-Content-Type-Options, Referrer-Policy.
  2. Добавьте защиту от встраивания во фреймы: X-Frame-Options и frame-ancestors.
  3. Включите HSTS с коротким сроком действия, проверьте работу, затем увеличьте срок.
  4. Запустите CSP в режиме отчётов, доработайте политику на реальном трафике и в последнюю очередь переведите её в режим принудительного применения.

Измеряйте, а не предполагайте

После изменений убедитесь, что заголовки действительно применяются. Введите свой домен в бесплатном тесте в разделе «Инструменты пентеста», чтобы получить оценку заголовков и увидеть все недостающие на одном экране.

Следующая статья

Ошибки проверки подписи JWT: библиотека обновлена, конфигурация — нет