HSTS — что это такое и зачем нужен вашему сайту
HSTS (HTTP Strict Transport Security) — это механизм безопасности, который сообщает браузеру: «Этот сайт должен загружаться только по SSL/TLS проверку. Никогда не используй HTTP». После получения заголовка HSTS браузер автоматически перенаправляет все HTTP-запросы на HTTPS, даже если пользователь вручную ввёл адрес без https://.
Зачем нужен HSTS
Вы настроили SSL-сертификат, добавили редирект с HTTP на HTTPS — казалось бы, достаточно. Но без HSTS остаётся уязвимость: первый запрос пользователя может уйти по HTTP, и злоумышленник может его перехватить.
Основные угрозы без HSTS:
- SSL stripping (атака Мокси Марлинспайка) — злоумышленник перехватывает HTTP-запрос и подменяет ответ, не давая браузеру перейти на HTTPS
- Перехват cookies — если cookie установлено без флага Secure, оно может утечь через HTTP-запрос
- Mixed content — HTTP-ресурсы на HTTPS-странице создают уязвимости
- Фишинг через поддомены — без includeSubDomains атакующий может создать HTTP-версию поддомена
Как работает HSTS
Механизм прост, но эффективен:
- Пользователь впервые заходит на сайт по HTTPS
- Сервер отправляет заголовок:
Strict-Transport-Security: max-age=31536000; includeSubDomains - Браузер запоминает, что этот домен должен использовать только HTTPS
- В течение указанного времени (max-age) все HTTP-запросы автоматически преобразуются в HTTPS на стороне браузера — без обращения к серверу
Это называется «внутренний редирект 307» — браузер делает его самостоятельно, без сетевого запроса.
Синтаксис заголовка HSTS
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Разберём каждую директиву:
| Директива | Описание | Рекомендация |
|---|---|---|
max-age | Время действия в секундах | 31536000 (1 год) для production |
includeSubDomains | Распространить на все поддомены | Включать, если все поддомены поддерживают HTTPS |
preload | Запрос на включение в preload-список браузеров | Включать после тестирования |
Настройка HSTS на популярных серверах
Nginx
server {
listen 443 ssl;
server_name example.com;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
}
Важно: добавляйте заголовок только для HTTPS-блока (443), не для HTTP (80).
Apache
<VirtualHost *:443>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</VirtualHost>
PHP (программно)
header('Strict-Transport-Security: max-age=31536000; includeSubDomains; preload');
Preload-список HSTS
Preload-список — это список доменов, встроенный в браузеры Chrome, Firefox, Safari и Edge. Для доменов из этого списка HTTPS используется с самого первого посещения — даже если пользователь никогда не был на сайте.
Требования для включения в preload-список:
- Валидный SSL-сертификат
- Редирект с HTTP на HTTPS на основном домене
- HSTS-заголовок с
max-ageне менее 31536000 (1 год) - Директива
includeSubDomains - Директива
preload - Все поддомены должны поддерживать HTTPS
Подать заявку можно на hstspreload.org.
Типичные ошибки при настройке HSTS
- Слишком малый max-age — значения меньше 1 года не принимаются в preload-список. Начните с 300 секунд для тестирования, затем увеличьте
- HSTS на HTTP — заголовок на HTTP-ответе игнорируется браузерами (и это правильно — иначе злоумышленник мог бы его подделать)
- includeSubDomains без проверки — если хотя бы один поддомен не поддерживает HTTPS, пользователи потеряют к нему доступ
- Забыли про API документацию и ресурсы — если API или CDN используют HTTP, HSTS может сломать интеграции
- Невозможность отката — после включения preload удалить домен из списка сложно и долго (несколько месяцев)
Рекомендуемый план внедрения
- Убедитесь, что весь сайт работает по HTTPS, включая все ресурсы
- Настройте редирект HTTP → HTTPS
- Добавьте HSTS с
max-age=300(5 минут) для тестирования - Проверьте заголовок с помощью инструмента проверки HTTP-заголовков enterno.io
- Увеличьте
max-ageдо 604800 (1 неделя), затем до 2592000 (1 месяц) - Добавьте
includeSubDomains, убедившись, что все поддомены готовы - Добавьте
preloadи подайте заявку на hstspreload.org - Установите финальное значение
max-age=31536000(1 год)
Как проверить HSTS на сайте
Самый быстрый способ — использовать проверку HTTP-заголовков на enterno.io. Введите URL вашего сайта и найдите в ответе заголовок Strict-Transport-Security. Инструмент покажет значение max-age, наличие директив includeSubDomains и preload.
Также можно проверить в Chrome DevTools: откройте вкладку Network, выберите основной документ и посмотрите Response Headers.
Итоги
HSTS — это простой, но мощный инструмент защиты. Он не требует сложной настройки, но значительно повышает безопасность за счёт принудительного использования HTTPS. Если ваш сайт уже работает по HTTPS, нет причин не включить HSTS — это бесплатная и эффективная мера защиты от целого класса атак.
Проверьте ваш сайт прямо сейчас
Проверить →