G|Translate: English EN Français FR Deutsch DE Italiano IT Русский RU Español ES

HTTP заголовки безопасности

Что это за загадочные письмена?

HTTP заголовки безопасности

В процессе запроса сайта с сервера – браузер и сервер обмениваются информацией. Сервер может заранее сообщить браузеру, что можно и что нельзя делать с сайтом.

Про взаимодействие браузера и сервера читаем здесь

Security HTTP Headers для “чайников”

Например сервер может указать браузеру:

  • сразу переходить на HTTPS-версию
  • запрещать открывать сайт во фрейме
  • и так далее

За это как раз отвечают HTTP заголовки безопасности.

Проверить свой сайт можно на ресурсе

https://securityheaders.com/

HTTP заголовки безопасности

Для сайта https://seotable.ru/ всё хорошо.

На ресурсе также ведется своя статистика тестирования

HTTP заголовки безопасности

1 408 191 / 134 749 409 = всего 1% протестированных сайтов имеют все необходимые HTTP заголовки безопасности.

За эту красоту отвечают настройки в Apache в файле .htaccess

# HTTP security headers
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Content-Security-Policy "upgrade-insecure-requests"
Header always set X-XSS-Protection "1; mode=block"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy: "strict-origin-when-cross-origin"
Header always set Permissions-Policy "interest-cohort=(), geolocation=(),midi=(),sync-xhr=(),microphone=(),camera=(),magnetometer=(),gyroscope=(),fullscreen=(self),payment=()"
Header always set Expect-CT "max-age=7776000, enforce"
</IfModule> 
#

Конструкция <IfModule mod_headers.c>…</IfModule> нужна для исключения ошибки, если модуль HTTP заголовков mod_headers.c не установлен в Apache.

В чем разница между Header always set и Header set в Apache? Без “always” Ваши заголовки будут выставляться только на успешные ответы сервера 200 OK.

Примечание: включить HTTP заголовки безопасности можно также:

  • через настройки Nginx
  • с помощью PHP функции header() – например, в WordPress можно список заголовков через эту функцию добавить прямо в файл wp-config.php (это же исполняемый файл PHP) или использовать функцию wp_headers() в файле function.php или в плагине
  • с помощью метатегов HTML <META HTTP-EQUIV=”имя” CONTENT=”содержимое”> в разделе <head>…</head>

ВАЖНО:  META-теги с атрибутом HTTP-EQUIV эквивалентны HTTP-заголовкам. Теги такой формы могут дать такой же эффект, что и HTTP-заголовки, и на некоторых серверах автоматически могут быть переведены в настоящие HTTP-заголовки. Некоторые генерируемые сервером поля заголовков не могут быть подменены значениями из META-тегов (в частности Date), другие подменяются только при ненормальном статус-коде (<>200). Когда заголовок не понятен, то значение HTTP-заголовка превалирует над значением META-тегов.

Вот в этой статье подробнее

Какие бывают META теги и зачем они нужны

Заголовок HTTP Strict Transport Security (HSTS)

Самый известный заголовок Strict Transport Security (HSTS) – это механизм политики безопасности, который позволяет защитить сайт от попытки небезопасного соединения.

У хороших хостеров включается кнопкой в панели управления при подключении HTTPS

HTTP заголовки безопасности

Суть HSTS –  при установлении соединения с сервером браузер будет сразу использоваться протокол HTTPS, не дожидаясь переадресации с HTTP.

Тоже самое можно реализовать вручную, указав дополнительную инструкцию в файле .htaccess

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

Принимаемые значения:

  • max-age=31536000 время в секундах (1 год минимум), которое браузер должен помнить о заголовке.
  • includeSubDomains Если указать это опциональное значение, то заголовок распространяется и на все поддомены (соответственно и поддомены должны иметь SSL-сертификат и HTTPS протокол).
  • preload если владелец сайта хочет, чтобы домен попал в предопределённый список, поддерживаемый Chrome (и используемый Firefox и Safari)

Если Вы включили настройку HTST у хостера (Nginx) и дополнительно прописали этот же заголовок в Apache – получите предупреждение о дублировании

HTTP заголовки безопасности

Проверить использовании заголовка HSTS можно с помощью сервиса

https://hstspreload.org/

Посмотрим на результат

HTTP заголовки безопасности

Тоже все хорошо. Предлагается добавить проверяемый сайт в листинг браузера Хром (т.к. есть директива preload).

HSTS preload list — это листинг сайтов chromium.org, которые по умолчанию в браузере будут открываться сразу только по HTTPS, даже если пользователь попытается обратиться к домену по http. Листинг используется большинством современных браузеров.

Возможные ошибки:

  • заголовок HSTS включен в Nginx и в Apache (и возможно где-то еще)
  • HTTP заголовки безопасности
  • нет директивы includeSubDomains или preload
  • время в секундах слишком маленькое (рекомендуется 31536000 сек = 1 год)

HTTP заголовки безопасности

Заголовок HTTP X-Frame-Options

Злоумышленник направил вас на свой веб-сайт, на котором отображается очень привлекательная ссылка для нажатия. К сожалению, он также встроил в страницу <iframe> your-bank.com/transfer?amount=-1&[attacker@gmail.com]</iframe>, но скрыл его, установив прозрачность на 0%.

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

Заголовок X-Frame-Options служит инструкцией для браузера не загружать Вашу страницу в frame/iframe. Не все браузеры поддерживают этот вариант – нужно проверять.

Инструкция в файле .htaccess

Header always set X-Frame-Options "SAMEORIGIN"

Параметры:

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

Заголовок X-Frame-Options считался лучшим способом предотвращения атак с использованием щелчков на основе фреймов до тех пор, пока через несколько лет не вступил в игру еще один заголовок — Content Security Policy или CSP для краткости.

Заголовок HTTP Content-Security-Policy (CSP)

Content Security Policy (CSP), что в переводе означает «Политика безопасности контента». Допустим у Вас есть сайт, на котором вы показываете рекламу пользователям и честно зарабатываете деньги. И всё идёт хорошо, пока к вам не начнут ходит пользователи с заражёнными браузерами. Заражённый браузер будет подменять рекламу на вашем сайте на свою и показывать её пользователю.

Злоумышленник может создать определенную ссылку, которая выполняет произвольный JavaScript в браузере жертвы.

Инструкция в файле .htaccess

Header always set Content-Security-Policy "upgrade-insecure-requests"

Указатель upgrade-insecure-requests заставляет браузер волшебным образом переделать все HTTP-запросы в HTTPS-запросы.

Однако CSP касается не только используемого протокола. Он предлагает детальные способы определения того, какие ресурсы и действия разрешены на вашем сайте. Вы можете, например, указать, какие скрипты должны выполняться или откуда загружать изображения. Если что-то не разрешено, браузер блокирует это действие и предотвращает потенциальные атаки на ваш сайт.

Интересным вариантом CSP является режим только для отчетов. Вместо того чтобы использовать заголовок Content-Security-Policy, вы можете сначала проверить влияние CSP на ваш сайт, сказав браузеру просто сообщать об ошибках, не блокируя выполнение скрипта и т. д., Используя заголовок Content-Security-Policy-Report-Only.

Заголовок HTTP X-XSS-Protection

Несмотря на то, что он заменен CSP, заголовок X-XSS-Protection обеспечивает аналогичный тип защиты. Этот заголовок используется для блокировки атак XSS в старых браузерах, которые не полностью поддерживают CSP. Этот заголовок не поддерживается Firefox.

Инструкция в файле .htaccess

Header always set X-XSS-Protection "1; mode=block"

Заголовок ответа HTTP X-XSS-Protection  останавливает загрузку страниц при обнаружении XSS атаки.

Например, от этого в адресной строке –  http://www.site.com/page.php?var=<script>alert(‘xss’);</script>

Читаем статью

XSS глазами злоумышленника

Заголовок HTTP X-Content-Type-Options

HTTP-заголовок ответа X-Content-Type-Options является маркером, используемым сервером для указания того, что типы MIME, объявленные в заголовках Content-Type, должны соблюдаться и не изменяться. Это позволяет отказаться предотвратить подмену типов MIME.

Другими словами – при загрузке файла картинки на сервер злоумышленник пытается загрузить исполняемый скрип под названием picture.jpg

Инструкция в файле .htaccess

Header always set X-Content-Type-Options "nosniff"

Этот HTTP-заголовок был введен Microsoft в IE 8 как способ  блокировать происходящий перехват содержимого преобразовывать неисполняемые типы MIME в исполняемые типы MIME. С тех пор другие браузеры внедрили его, даже если их алгоритмы обработки MIME были менее агрессивными.

Заголовок HTTP Referrer-Policy

Знание полного URL-адреса, с которого пришел посетитель, включая аргументы запроса, может раскрыть термины последнего поискового запроса или личные данные, такие как адрес электронной почты.

Инструкция в файле .htaccess

Header always set Referrer-Policy: "strict-origin-when-cross-origin"

Возможные значения:

  • “no-referrer-when-downgrade” – это значение по умолчанию: Referer отправляется всегда, если только мы не отправим запрос из HTTPS в HTTP (из более безопасного протокола в менее безопасный).
  • no-referrer” – никогда не отправлять Referer.
  • “origin” – отправлять в Referer только текущий источник, а не полный URL-адрес страницы, например, посылать только http://site.com вместо http://site.com/path.
  • “origin-when-cross-origin” – отправлять полный Referer для запросов в пределах текущего источника, но для запросов на другой источник отправлять только сам источник (как выше).
  • “same-origin” – отправлять полный Referer для запросов в пределах текущего источника, а для запросов на другой источник не отправлять его вообще.
  • “strict-origin” – отправлять только значение источника, не отправлять Referer для HTTPS→HTTP запросов.
  • strict-origin-when-cross-origin” – для запросов в пределах текущего источника отправлять полный Referer, для запросов на другой источник отправлять только значение источника, в случае HTTPS→HTTP запросов не отправлять ничего.
  • “unsafe-url” – всегда отправлять полный URL-адрес в Referer, даже при запросах HTTPS→HTTP.

Вот таблица со всеми комбинациями:

ЗначениеНа тот же источникНа другой источникHTTPS→HTTP
"no-referrer"
"no-referrer-when-downgrade" или "" (по умолчанию)fullfull
"origin"originoriginorigin
"origin-when-cross-origin"fulloriginorigin
"same-origin"full
"strict-origin"originorigin
"strict-origin-when-cross-origin"fullorigin
"unsafe-url"fullfullfull

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

Ссылки в пределах вашего собственного сайта включают полный реферер.

Заголовок HTTP Permissions-Policy

Это заголовок безопасности, который определяет, какие функции браузер можно использовать на данном сайте.

Инструкция в файле .htaccess

Header always set Permissions-Policy "interest-cohort=(), geolocation=(),midi=(),sync-xhr=(),microphone=(),camera=(),magnetometer=(),gyroscope=(),fullscreen=(self),payment=()"

Заголовок HTTP Permissions-Policy заменяет существующий заголовок Feature-Policy для управления делегированием разрешений браузера.

Параметр interest-cohort=() запрещает браузеру использовать новую технологию Google FLoC для создания “цифрового” отпечатка пользователя.

Вот  в этой статье подробнее

Отключение Google FloC на вашем веб-сайте

Заголовок HTTP Expect-CT

Цель этого заголовка — сообщить браузеру, что он должен выполнить дополнительные «фоновые проверки», чтобы убедиться, что сертификат является подлинным: когда сервер использует заголовок Expect-CT, он в основном запрашивает у клиента проверить, что используемые сертификаты находятся в открытых журналах сертификатов прозрачности (CT).

Инструкция в файле .htaccess

Header always set Expect-CT "max-age=7776000, enforce"

Параметры:

  • включить проверку CT для текущего приложения на период max-age=777600 секунд (9 суток)
  • enforce обеспечить соблюдение этой политики и запретить доступ к приложению в случае нарушения
  • отправить отчет по указанному URL-адресу в случае нарушения (дополнительный параметр) – report-uri=”https://ct.example.com/report


Вы можете сохранить ссылку на эту страницу себе на компьютер в виде htm файла





Почитать в разделе: БЕЗОПАСНОСТЬ САЙТА

  • Всего статей в разделе: 8
  • Показано статей в списке: 5
  • Сортировка: название по алфавиту

Защищаем форму обратной связи от ботов

Есть форма обратной связи для клиентов Читаем статью Форма обратной связи Проблема в том, что если просто разместить код html формы на странице - рекламные боты замучают.  И fail2ban особо не поможет, т.к. IP-адресов много и они динамически меняются.  И будет что-то типа такого безобразия Да, добавление разных фильтров (у нас же есть PHP под рукой) помогает - но сервер PHP будет заниматься этой чепухой, вместо того, что бы работать с реальными посетителями сайта. Что делать? Создаем форму обратной связи через PHP Будем прятать форму от глупых...
(Читать полностью...)

Как включить HTTPS на сайте?

Существуют два основных протокола передачи данных от сервера к пользователю http - трафик между ПК пользователя и хостингом не шифруется (враги могут добавить рекламу для показа на Вашем сайте) https - трафик между ПК пользователя и хостингом шифруется (т.е. например, Ваш провайдер не сможет увидеть, какая информация идет с сайта / на сайт) Более того, в последнее время поисковые машины начинают отдавать предпочтения сайтам с протоколом https (поднимая сайты в выдаче и считая их более безопасными для пользователя). HTTPS (англ. HyperText Transfer Protocol Secure) — расширение протокола HTTP, для поддержки шифрования в целях повышения безопасности. Данные в протоколе HTTPS передаются...
(Читать полностью...)

Как проверить сайт на вирусы?

Для чего это надо? Что быть уверенным, что это Ваш сайт :) Фактически векторы атаки разные и там могут быть не только вирусы: - добавлена переадресация на чужой сайт - воруют Ваш трафик - переадресация на сайт с троянами - используют Ваш сайт для создания ботнета - Ваш сайт уже является частью ботнета - с помощью Вашего сайта (точнее сервиса хостинга) рассылается спам Самая простая регулярная проверка сайта на вирусы - добавить сайт в Вебмастер mail.ru = там по умолчанию встроен бесплатный антивирус, точнее набор...
(Читать полностью...)

Настраиваем fail2ban под свои задачи

Крайне полезное серверное приложение Linux - настраиваем под себя Про установку и запуск читаем здесь Установка fail2ban на Linux Для самостоятельной настройки нужно: лог с данными настроить фильтр (получение IP из лога) действия (что делать с этими IP) и джайл - связать фильтр и действие :) Например, как это сделать для блокировки ботов-подборщиков логина и пароля в WordPress - читаем статью Блокируем ботов-подборщиков через fail2ban Или создаем свой вариант. Делаем свой лог Например в корневой папке web-server (в папках выше политика безопасности сервера не даст доступа нашему...
(Читать полностью...)

Установка fail2ban на Linux

Устанавливаем и запускаем fail2ban на Linux Сначала разберемся с названиями. Всё это - "детальки" сервера на Linux Название Описание netfilter Межсетевой экран (брандмауэр), встроен в ядро Linux с версии 2.4. iptables (IP4) ip6tables (IP6) Название пользовательской утилиты (запускаемой из командной строки), предназначенной для управления системой netfilter. ipset Позволяет использовать большие таблицы IP и MAC адресов, подсетей, номеров портов совместно...
(Читать полностью...)