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

Проверьте HSTS, CSP, X-Frame-Options, Referrer-Policy, флаги cookie и другие заголовки безопасности сайта и получите оценку от A+ до F

Как проверить заголовки безопасности сайта

Инструмент запрашивает страницу с сервера PingDesk, проходит редиректы и оценивает HTTP-заголовки итогового ответа: HSTS, Content-Security-Policy, X-Content-Type-Options, защиту от встраивания во фрейм, Referrer-Policy, Permissions-Policy, политики Cross-Origin, раскрытие версий ПО и флаги cookie. Каждая проверка получает статус, баллы и объяснение, а сайт — итоговую оценку от A+ до F.

Заголовки безопасности — дешёвый способ закрыть целые классы атак: перехват трафика при первом заходе по HTTP, кликджекинг, выполнение внедрённых скриптов, утечку адресов страниц на сторонние сайты. Обычно они включаются несколькими строками в конфигурации nginx, Apache или фреймворка.

Как пользоваться проверкой

  1. 1Введите домен или полный адрес страницы. Без протокола проверка пойдёт по https://.
  2. 2Нажмите «Проверить». Сервер PingDesk выполнит GET-запрос, пройдёт до пяти редиректов и оценит заголовки последнего ответа; содержимое страницы не анализируется.
  3. 3Посмотрите оценку и строку «Проверен адрес» — убедитесь, что редиректы привели туда, куда ожидалось.
  4. 4Пройдитесь по проверкам со статусом «Нет защиты» и «Замечание»: в каждой есть пояснение и пример заголовка, который стоит добавить.
  5. 5После изменения конфигурации запустите проверку снова. Если сайт за CDN, заголовки могут добавляться или удаляться на его стороне — проверьте и правила CDN.

Какие заголовки проверяются и зачем они нужны

Ни один заголовок не заменяет исправление уязвимостей в коде, но вместе они заметно сокращают поверхность атаки. Ниже — что именно оценивает инструмент.

ЗаголовокОт чего защищаетРекомендуемое значение
Strict-Transport-SecurityПерехват и подмена трафика при заходе по HTTPmax-age=31536000; includeSubDomains
Content-Security-PolicyВыполнение внедрённых скриптов (XSS), загрузка чужих ресурсовdefault-src 'self' и явный список источников
X-Content-Type-OptionsИсполнение файла не того типа (MIME-sniffing)nosniff
X-Frame-Options или frame-ancestorsКликджекинг — встраивание сайта в невидимый фреймSAMEORIGIN или frame-ancestors 'self'
Referrer-PolicyУтечка адресов страниц и параметров на другие сайтыstrict-origin-when-cross-origin
Permissions-PolicyДоступ фреймов и скриптов к камере, микрофону, геолокацииcamera=(), microphone=(), geolocation=()
Cross-Origin-Opener-PolicyУправление вашим окном из открытого чужого окнаsame-origin
Cross-Origin-Resource-PolicyПодгрузка ваших ответов чужими сайтамиsame-origin или same-site
Server, X-Powered-ByПодбор эксплойтов по версии ПОБез номеров версий
Set-CookieКража и подделка сессионных cookieSecure; HttpOnly; SameSite=Lax

Как считается оценка

Оценка прозрачна: за каждую проверку начисляются баллы, в сумме максимум 100. Пройденная проверка даёт полный балл, «Замечание» — часть, «Нет защиты» — ноль или минимум. Таблица с полученными баллами показывается под результатом.

Шкала: A+ — от 95 баллов, A — от 80, B — от 65, C — от 50, D — от 35, E — от 25, F — меньше 25. Есть два ограничения: A+ ставится только без проваленных проверок, а сайт, который в итоге открылся по HTTP, получает не выше D.

Максимальные баллы по проверкам
ПроверкаБаллыКак начисляются
HSTS2014 за max-age от 180 дней (7 — за меньший), +4 за includeSubDomains, +2 за preload с includeSubDomains и max-age от года
CSP20Минус 6 за 'unsafe-inline' без nonce или хэша, минус 4 за 'unsafe-eval', минус 6 за *, https: или data: в script-src, минус 8 без script-src и default-src; не меньше 4. Только Report-Only — 4
X-Content-Type-Options10Только за значение nosniff
Защита от фрейминга105 за ALLOW-FROM или frame-ancestors *
Referrer-Policy105 за отсутствие или мягкие значения, 0 за unsafe-url
Permissions-Policy52 за устаревший Feature-Policy
COOP5За same-origin или same-origin-allow-popups
CORP52 за cross-origin
Раскрытие версий53, если технология видна без версии
Cookie10Минус 4 без Secure, минус 3 без HttpOnly, минус 3 без SameSite

HSTS: max-age, includeSubDomains и preload

HSTS (RFC 6797) сообщает браузеру, что сайт нужно открывать только по HTTPS в течение max-age секунд. Браузер принимает заголовок только из HTTPS-ответа — полученный по HTTP он игнорирует, поэтому сначала нужен рабочий HTTPS и редирект.

Рекомендуемый минимум max-age — 15552000 секунд (180 дней), лучше год. includeSubDomains распространяет правило на все поддомены — включайте его, когда убедились, что все они работают по HTTPS. Директива preload нужна для включения домена в список, встроенный в браузеры; по требованиям hstspreload.org для этого нужны max-age не меньше года и includeSubDomains.

Content-Security-Policy без ложного чувства защиты

CSP задаёт, откуда странице разрешено загружать скрипты, стили, картинки и фреймы. Главная ценность — ограничение скриптов: даже если злоумышленник внедрит код через XSS, браузер не выполнит его.

Политика с 'unsafe-inline' в script-src эту защиту почти отменяет: встроенные скрипты разрешены. Если в списке есть nonce или хэш, современные браузеры 'unsafe-inline' игнорируют, и инструмент это учитывает. Начинать удобно с Content-Security-Policy-Report-Only: браузер сообщает о нарушениях, но ничего не блокирует.

  • CSP из тега meta инструмент не видит — оцениваются только HTTP-заголовки. Кроме того, frame-ancestors в meta не работает.
  • Если заголовков CSP несколько, ресурс должен пройти каждую политику, поэтому учитывается самая строгая.
  • frame-ancestors имеет приоритет над X-Frame-Options в современных браузерах.

Частые вопросы

Как проверить заголовки безопасности сайта?

+

Введите адрес в поле выше. Инструмент сделает запрос с сервера PingDesk, пройдёт редиректы, оценит заголовки итоговой страницы и покажет оценку, баллы по каждой проверке и рекомендуемые значения.

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

+

Смотрите карточку HSTS: в ней значение Strict-Transport-Security, срок max-age в днях и наличие includeSubDomains и preload. Если сайт открылся по HTTP, HSTS считается отсутствующим — браузеры принимают его только по HTTPS.

Почему оценка низкая, хотя сайт работает по HTTPS?

+

HTTPS шифрует соединение, но не защищает от XSS, кликджекинга и утечки данных через Referer. За это отвечают CSP, X-Frame-Options, Referrer-Policy и другие заголовки — без них сайт получит невысокую оценку даже с действующим сертификатом.

Нужен ли заголовок X-XSS-Protection?

+

Нет. Встроенный XSS-фильтр, которым он управлял, удалён из современных браузеров. Инструмент его не оценивает: защиту от XSS даёт Content-Security-Policy.

Почему заголовки на сайте есть, а проверка их не видит?

+

Частые причины: заголовок добавляется только для части путей или только для статуса 200, CDN или прокси вырезает его, либо проверялась страница после редиректа на другой домен. Сверьте поле «Проверен адрес» и правила на сервере и в CDN.

Какие cookie должны иметь флаг HttpOnly?

+

Все, которые не нужны JavaScript: сессии, токены авторизации, CSRF-cookie на сервере. Без HttpOnly cookie можно украсть через XSS. Secure нужен всем cookie на HTTPS-сайте, а SameSite=None без Secure браузеры отклоняют.

Что значит пропавший заголовок после деплоя?

+

Скорее всего, изменилась конфигурация веб-сервера, обработчик ошибок или правила CDN. Такие регрессии незаметны пользователям, поэтому заголовки стоит проверять регулярно, а не один раз.

Связанные инструменты