• Блог
  • HTTP заголовки для защиты сайта

Продолжаем тему безопасности сайта. На этот раз уделим внимание HTTP заголовкам для защиты от основных угроз - межсайтовая подделка запросов (XSS), внедрения кода, подделки MIME-типов, кликджекинга и т.п. Это дополнительный уровень защиты. В борьбу с этими угрозами включились и браузеры.

Давайте узнаем, какие заголовки позволяют нам повысить безопасность сайта. Зайдите на сайт securityheaders.com и введите адрес своего или любого другого сайта. И сервис покажет вам список этих заголовков.

  • X-XSS-Protection
  • X-Frame-Options
  • X-Content-Type-Options
  • Strict-Transport-Security
  • Content-Security-Policy
  • Referrer-Policy
  • Feature-Policy

X-XSS-Protection

Заголовок X-XSS-Protection включает встроенный в браузер фильтр межсайтового скриптинга. Он ищет яваскрипт код в GET или POST параметрах. Если найдёт, то страница блокируется и показывается предупреждение.

Значение Описание
0 Фильтрация XSS отключена.
1 Фильтрация XSS включена, браузер очистит страницу от опасного содержимого при обнаружении атаки.
1; mode=block Фильтрация XSS включена, браузер предотвратит загрузку страницы при обнаружении атаки.
1; report=URL Фильтрация XSS включена, браузер очистит страницу от опасного содержимого при обнаружении атаки и отправит отчет.

X-Frame-Options

Защищает сайт от кликджекинга (clickjacking). Злоумышленники могут использовать фреймы для накрутки лайков и для отправки спама. Например, на сайте-доноре поверх какой-нибудь кнопки создаётся прозрачный фрейм с вашим сайтом. Пользователь жмёт на кнопку, а действие совершается на вашем сайте. Если вы нигде не используете показ сайта во фрейме, то лучше отключить такую функцию.

Значение Описание
SAMEORIGIN Позволяет загрузку контента в frame/iframe только если фрейм и страница, его загружающая, расположены на одном домене.
DENY Запрещает загрузку контента в frame/iframe.
ALLOW-FROM Допускает загрузку контента в фреймах только для определенного URI.

X-Content-Type-Options

Данный заголовок предотвращает атаки с подменой типов MIME. Установите значение nosniff, чтобы запретить браузерам выполнение контента, похожего на JavaScript, для которого не установлено правильное значение типа контента.

Strict-Transport-Security

Этот заголовок (HSTS) предотвращает любые попытки подключения к сайту по обычному HTTP. Он помогает предотвратить MiTM атаки (Man In The Middle), направленных на перехват соединения между пользователем и веб-сайтом, в частности атаку с понижением степени защиты и воровство кук. Каждый раз, когда браузер видит заголовок HSTS в ответе вашего сайта, он отказывается подключаться по небезопасному подключению (используя HTTP) к вашему домену в течении указанного времени. Поэтому обязательно убедитесь, что все страницы сайта и статические файлы нормально загружаются по HTTPS.

Значение Описание
max-age Время в секундах, которое будет действовать этот заголовок. Если быть точнее, то это время, в течение которого сайт будет доступен по протоколу HTTPS. Обычно используют 31536000 секунд, то есть 1 год.
includeSubDomains Указывает, что действие заголовка распространяется также на поддомены. Необязательный.
preload Параметр, указывающий, что ваш сайт никогда не будет доступен по незащищенному протоколу. Используется список доверенных доменов. Можно подать заявку на включение вашего домена в этот список, но это не быстрая процедура. Необязательный.

Content-Security-Policy

Заголовок CSP позволяет указать список разрешённых источников, с которых можно загружать ресурсы. Можно указать браузеру не исполнять inline-скрипты и загружать файлы только с одного домена. Параметров у этого заголовка много. Вот основные:

Значение Описание
default-src Загружать с определенного источника все ресурсы (картинки, скрипты, фреймы и т.д.). Значение none блокирует всё.
script-src Разрешённые источники для скриптов.
style-src Разрешённые источники для стилей.

Referrer-Policy

Настраивает уровень детализации для включения в заголовок Referer при уходе со страницы. Помогает предотвратить утечку данных на сайты, куда идут ссылки.

Можно выбрать несколько стратегий из доступных вариантов Referrer-Policy, но обычно используют origin-when-cross-origin, который включает Referer для всех нормальных запросов, но усекает значение только до домена, если ссылка идёт от одного домена к другому. Ссылки в пределах вашего собственного сайта включают полный реферер.

Feature-Policy

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

Настройка MODX

Как настроить заголовки для серверов указано в этой статье. Я расскажу, как сделать это прямо в MODX.

Открываем верхнее меню Содержимое и выбираем пункт "Типы содержимого". В таблице редактируем строку для HTML и добавляем пользователькие заголовки.

И ещё один важный момент. Чтобы обезопасить себя от похищения куки (в том числе сессионной куки), включите системную настройку session_cookie_httponly. Это не позволит злоумышленнику с помощью яваскрипт получить доступ к куки в document.cookie. А если ваш сайт использует протокол HTTPS, рекомендую включить системную настройку session_cookie_secure, которая будет отдавать куки только для запросов по HTTPS протоколу.

Дополнительные материалы

Экзотические заголовки HTTP.

06 сентября 2018, 18:24   636     4

Комментарии ()

  1. Vladimir 06 сентября 2018, 22:57 # +1
    Спасибо за полезную статью!
    X-Frame-Options, «Если вы нигде не используете показ сайта во фрейме, то лучше отключить такую функцию.» -вебвизор в Яндекс.Метрике, например. Если кто-то отслеживает поведение юреров, то отключить не вариант.
    Я добавляю заголовки Cache-Control: max-age=3600, must-revalidate и Vary: Accept-Encoding для удовлетворения требования Google PageSpeed Insights
    1. Сергей Шлоков 07 сентября 2018, 06:48 # 0
      X-Frame-Options: ALLOW-FROM https://www.yandex.ru/
      Для настройки кэширования используют ещё заголовок ETag.
      1. Vladimir 07 сентября 2018, 07:00 # 0
        Спасибо еще раз. Тогда да, только у них доменов может быть много, нужно более одного разрешать. Интересно, есть ли такая возможность, тут не вижу developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options, или не внимательно смотрел.
        1. Сергей Шлоков 07 сентября 2018, 07:25 # 0
          Для множественных доменов придется использовать заголовок Content-Security-Policy с параметром frame-ancestors, который позволяет указывать список доменов и использовать маски.
          Кстати, согласно спецификации он перебивает X-Frame-Options.

    Вы должны авторизоваться, чтобы оставлять комментарии.

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.