Безопасность
Проверка заголовков безопасности
Оценивает вставленный набор заголовков ответа, объясняет каждый пункт и собирает блок для nginx из того, чего не хватает.
Скопируйте из вкладки «Сеть» в инструментах разработчика или из вывода curl -I.
Страница ничего не запрашивает у вашего сайта: оценивается ровно то, что вы вставили. Так можно проверить и внутренний стенд, до которого из интернета не достучаться.
Оценка
F
3 из 100
Критично
2
Стоит поправить
7
Заголовков разобрано
9
HTTP/2 200
Разбор
Strict-Transport-Security
стоит поправитьmax-age=600 — меньше рекомендованных полугода
Для списка предзагрузки нужен минимум 31536000 (год) плюс includeSubDomains и preload.
max-age=600
Content-Security-Policy
нужно чинитьЗаголовка нет
Главная защита от XSS. Начните с режима Report-Only и посмотрите отчёты.
X-Content-Type-Options
нужно чинитьЗаголовка нет
Без него браузер угадывает тип файла и может выполнить загруженную пользователем картинку как скрипт. Значение всегда одно: nosniff.
X-Frame-Options
стоит поправитьSAMEORIGIN — работает, но заголовок устарел
Современный вариант — frame-ancestors в CSP: он умеет список доменов, а ALLOW-FROM давно не поддерживается.
SAMEORIGIN
Referrer-Policy
стоит поправитьЗаголовка нет
По умолчанию браузеры шлют strict-origin-when-cross-origin, но это зависит от браузера. Задайте явно.
Permissions-Policy
по желаниюЗаголовка нет
Отключите то, чем не пользуетесь: camera=(), microphone=(), geolocation=().
Cross-Origin-Opener-Policy
по желаниюЗаголовка нет
same-origin отрезает открывшую вкладку от вашей страницы и защищает от атак через window.opener.
Cross-Origin-Resource-Policy
по желаниюЗаголовка нет
same-site запрещает чужим страницам подгружать ваши файлы напрямую.
X-XSS-Protection
стоит поправить1; mode=block — включает вырезанный из браузеров фильтр
Старый XSS-Auditor сам был источником уязвимостей и удалён. Правильное значение сегодня — 0 или отсутствие заголовка.
1; mode=block
server
стоит поправитьРаскрывает версию: nginx/1.24.0
Версия в заголовке — готовый список подходящих эксплойтов. Уберите или оставьте одно имя продукта.
nginx/1.24.0
x-powered-by
стоит поправитьРаскрывает версию: PHP/8.2.1
Версия в заголовке — готовый список подходящих эксплойтов. Уберите или оставьте одно имя продукта.
PHP/8.2.1
Set-Cookie: PHPSESSID
стоит поправитьнет Secure, нет HttpOnly, нет SameSite
Сессионной куке нужны все три флага: Secure, HttpOnly и SameSite=Lax или Strict.
PHPSESSID=abc123; path=/
Access-Control-Allow-Origin
по желаниюОткрыт для всех источников
Для публичного API это норма. Для страницы с личными данными — нет.
*
Чего не хватает — блок для nginx
# always — чтобы заголовки попадали и в страницы ошибок add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; add_header Content-Security-Policy "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'" always; add_header X-Content-Type-Options "nosniff" always; add_header X-Frame-Options "DENY" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always;
Строки ставятся в блок server. Слово always обязательно: без него nginx добавит заголовок только к успешным ответам, а страницы 404 и 500 останутся без защиты.
Порядок, в котором это внедряют
- X-Content-Type-Options: nosniff — не ломает ничего и закрывает целый класс атак.
- HSTS с коротким max-age, потом длинным. Обратной дороги почти нет: браузеры запоминают.
- frame-ancestors в CSP вместо X-Frame-Options.
- Referrer-Policy и Permissions-Policy — одна строка каждая.
- Полноценный CSP — последним и через режим отчёта: именно он ломает вёрстку чаще всего.