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 протоколу.
Дополнительные материалы
Комментарии ()
Вы должны авторизоваться, чтобы оставлять комментарии.
X-Frame-Options, «Если вы нигде не используете показ сайта во фрейме, то лучше отключить такую функцию.» -вебвизор в Яндекс.Метрике, например. Если кто-то отслеживает поведение юреров, то отключить не вариант.
Я добавляю заголовки Cache-Control: max-age=3600, must-revalidate и Vary: Accept-Encoding для удовлетворения требования Google PageSpeed Insights
Кстати, согласно спецификации он перебивает X-Frame-Options.