Как проверить заголовки безопасности сайта
Инструмент запрашивает страницу с сервера PingDesk, проходит редиректы и оценивает HTTP-заголовки итогового ответа: HSTS, Content-Security-Policy, X-Content-Type-Options, защиту от встраивания во фрейм, Referrer-Policy, Permissions-Policy, политики Cross-Origin, раскрытие версий ПО и флаги cookie. Каждая проверка получает статус, баллы и объяснение, а сайт — итоговую оценку от A+ до F.
Заголовки безопасности — дешёвый способ закрыть целые классы атак: перехват трафика при первом заходе по HTTP, кликджекинг, выполнение внедрённых скриптов, утечку адресов страниц на сторонние сайты. Обычно они включаются несколькими строками в конфигурации nginx, Apache или фреймворка.
Как пользоваться проверкой
- 1Введите домен или полный адрес страницы. Без протокола проверка пойдёт по https://.
- 2Нажмите «Проверить». Сервер PingDesk выполнит GET-запрос, пройдёт до пяти редиректов и оценит заголовки последнего ответа; содержимое страницы не анализируется.
- 3Посмотрите оценку и строку «Проверен адрес» — убедитесь, что редиректы привели туда, куда ожидалось.
- 4Пройдитесь по проверкам со статусом «Нет защиты» и «Замечание»: в каждой есть пояснение и пример заголовка, который стоит добавить.
- 5После изменения конфигурации запустите проверку снова. Если сайт за CDN, заголовки могут добавляться или удаляться на его стороне — проверьте и правила CDN.
Какие заголовки проверяются и зачем они нужны
Ни один заголовок не заменяет исправление уязвимостей в коде, но вместе они заметно сокращают поверхность атаки. Ниже — что именно оценивает инструмент.
| Заголовок | От чего защищает | Рекомендуемое значение |
|---|---|---|
| Strict-Transport-Security | Перехват и подмена трафика при заходе по HTTP | max-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 | Кража и подделка сессионных cookie | Secure; HttpOnly; SameSite=Lax |
Как считается оценка
Оценка прозрачна: за каждую проверку начисляются баллы, в сумме максимум 100. Пройденная проверка даёт полный балл, «Замечание» — часть, «Нет защиты» — ноль или минимум. Таблица с полученными баллами показывается под результатом.
Шкала: A+ — от 95 баллов, A — от 80, B — от 65, C — от 50, D — от 35, E — от 25, F — меньше 25. Есть два ограничения: A+ ставится только без проваленных проверок, а сайт, который в итоге открылся по HTTP, получает не выше D.
| Проверка | Баллы | Как начисляются |
|---|---|---|
| HSTS | 20 | 14 за max-age от 180 дней (7 — за меньший), +4 за includeSubDomains, +2 за preload с includeSubDomains и max-age от года |
| CSP | 20 | Минус 6 за 'unsafe-inline' без nonce или хэша, минус 4 за 'unsafe-eval', минус 6 за *, https: или data: в script-src, минус 8 без script-src и default-src; не меньше 4. Только Report-Only — 4 |
| X-Content-Type-Options | 10 | Только за значение nosniff |
| Защита от фрейминга | 10 | 5 за ALLOW-FROM или frame-ancestors * |
| Referrer-Policy | 10 | 5 за отсутствие или мягкие значения, 0 за unsafe-url |
| Permissions-Policy | 5 | 2 за устаревший Feature-Policy |
| COOP | 5 | За same-origin или same-origin-allow-popups |
| CORP | 5 | 2 за cross-origin |
| Раскрытие версий | 5 | 3, если технология видна без версии |
| Cookie | 10 | Минус 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. Такие регрессии незаметны пользователям, поэтому заголовки стоит проверять регулярно, а не один раз.