Причины:
1. Клиент вводит `http://` или переходит по ссылке/редиректу без HTTPS.
2. Атакующий перехватывает начальный HTTP-запрос, блокирует редирект на HTTPS и подменяет трафик (MITM — Man-in-the-Middle).
3. Даже если сервер редиректит `301` — браузер до первого успешного HTTPS-соединения не знает, что сайт должен быть только по HTTPS.
Решение:
Установка HSTS-заголовка (`Strict-Transport-Security`). После первого успешного HTTPS-ответа браузер запоминает: все будущие запросы к домену — только по HTTPS, даже если пользователь вводит `http://`. Отключает возможность игнорировать сертификатные ошибки (через `includeSubDomains` и `max-age`).
Пример конфигурации Nginx:
nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;- `max-age` — срок (в секундах) запоминания политики.
- `includeSubDomains` — распространить на все поддомены.
- `preload` — заявка на добавление в встроенные списки браузеров (Chrome, Firefox и др.).
Проверка (cURL):
bash
curl -sI https://forensicanvil.ru | grep -i strict-transport-securityВажно:
- Не включать, если на части поддоменов нет HTTPS (иначе они станут недоступны).
- `max-age` ставить не менее 6 месяцев (31536000 сек) для эффекта preload.
- После активации HSTS с `preload` откат без обновления списков занимает годы (невозможен удалённо).