На главную

Безопасность

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

Оценивает вставленный набор заголовков ответа, объясняет каждый пункт и собирает блок для 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 останутся без защиты.

Порядок, в котором это внедряют

  1. X-Content-Type-Options: nosniff — не ломает ничего и закрывает целый класс атак.
  2. HSTS с коротким max-age, потом длинным. Обратной дороги почти нет: браузеры запоминают.
  3. frame-ancestors в CSP вместо X-Frame-Options.
  4. Referrer-Policy и Permissions-Policy — одна строка каждая.
  5. Полноценный CSP — последним и через режим отчёта: именно он ломает вёрстку чаще всего.