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

Вставьте заголовки ответа страницы —curl -sI https://your-site.example/в терминале или блок из панели «Сеть» браузера — и получитеоценку от A+ до Fпо контрольному списку заголовков безопасности OWASP:Strict-Transport-Security, Content-Security-Policy, X-Content-Type-Options, защита от встраивания,Referrer-Policy, Permissions-Policy, тройка изоляции межсайтовых источников, утечки версий, устаревшие заголовки и флаги cookie — каждая находка в паре с точнойnginx, Apache и Expressстрокой, которая её исправляет. Всё работает в вашем браузере; страница никогда не обращается к вашему сайту.
Строка статуса необязательна. Все строки Set-Cookie проверяются. Чтобы вообще было что оценивать, постройте политику в генераторе CSP; чтобы разобрать блок заголовков построчно, используйте разборщик HTTP-заголовков.
Оценки пока нет. Вставьте заголовки ответа и нажмите Проверить заголовки или загрузите пример.
Строки исправления для каждой находки появятся здесь после проверки.
Область этой проверки против проверки SSL. Эта страница оценивает заголовки ответа безопасности (список OWASP выше). Проверка SSL оценивает вашу настройку HTTPS: цепочку сертификатов, версии протоколов, стойкость шифров и смешанный контент. HSTS и флаги cookie есть на обеих страницах, потому что оба списка их включают, но с разных сторон — запускайте обе проверки для полной картины.
Самопроверка
Заново запускает оценщик на фиксированных блоках заголовков: хороший пример на A+, плохой на F со всеми сработавшими штрафами, каждое правило по отдельности (арифметика оценки), ограничение за утечку версии, рекомендации по cookie, замечания о качестве CSP, frame-ancestors как защита от встраивания, пороги оценок по обе стороны каждой границы, фрагменты исправлений и негативные пути. Ничего никуда не отправляется.
Что такое заголовки безопасности?
Вкратце: заголовки безопасности — это заголовки ответа, которые велят браузеру применить защиту, которую он сам не может определить: никогда не загружать скрипты с неизвестных источников, никогда больше не общаться с этим хостом по обычному HTTP, никогда не встраивать эту страницу во фрейм — и каждый стоит одной строки конфигурации.
Заголовки, которые оценивает эта страница
ЗаголовокЗащищает отРекомендуемое значение OWASP
Strict-Transport-Securityпонижения протокола и кражи cookie при первом запросе по обычному HTTPmax-age=63072000; includeSubDomains
Content-Security-Policyмежсайтового скриптинга, вредоносных встраиваний, смешанного контентаdefault-src 'self'; form-action 'self'; base-uri 'self'; object-src 'none'; frame-ancestors 'none'; upgrade-insecure-requests
X-Content-Type-Optionsпутаницы MIME (скрипт, отданный как изображение)nosniff
X-Frame-Options / CSP frame-ancestorsкликджекинга (вашу страницу встраивает злоумышленник)deny / 'none'
Referrer-Policyутечки URL (с токенами) на сторонние сайтыno-referrer
Permissions-Policyстраниц и встраиваний, тихо использующих камеру, микрофон, геолокациювсе функции отключены
Cross-Origin-Opener-Policyдругих окон, лезущих в ваш контекст просмотраsame-origin
Cross-Origin-Embedder-Policyзагрузки ресурсов, которые не согласились на это (включает изоляцию процессов)require-corp
Cross-Origin-Resource-Policyваших ресурсов, встроенных другими сайтамиsame-origin
Как вычисляется оценка

Начните со 100 и вычитайте: −25 за отсутствие CSP, −20 за отсутствие HSTS, −10 за каждое отсутствие X-Content-Type-Options, Referrer-Policy или любой защиты от встраивания, −5 за каждый заголовок из тройки межсайтовой изоляции и Permissions-Policy, −5 за утечки версий в Server/X-Powered-By (с ограничением), и −5 за ненулевой X-XSS-Protection. Буквенные оценки: 100 = A+, 90+ = A, 80+ = B, 70+ = C, 60+ = D, ниже — F. Рекомендации (флаги cookie, управление кэшем, качество CSP) не вычитаются.

Распространённые ошибки
  • Установка заголовков на неправильные ответы. Добавляйте их на каждый ответ, включая страницы ошибок и перенаправления — именно для этого нужен always в add_header ... always; (nginx) и Header always set (Apache).
  • Проверка только главной страницы. Прокси, кэши и старые приложения иногда удаляют или переопределяют заголовки только на некоторых путях. Проверяйте страницы, которые важны: вход, оплату, конечные точки API.
  • Сохранение X-XSS-Protection. Аудитор, которым он управлял, сам порождал уязвимости; браузеры его удалили. Ненулевое значение теперь намеренно стоит баллов — уберите его и дайте работать CSP.
  • Вера, что X-Frame-Options актуален. Он не может разрешить конкретные источники и не входит в стандарт CSP; современная замена — frame-ancestors. Держать оба на время перехода нормально — эта страница принимает любой.
  • Отдача баннеров версий. Server: Apache/2.4.58 (Unix) сужает поиск известных ошибок злоумышленником без пользы для вас. Уберите версию; держите число строк малым.
Частые вопросы

Почему COOP/COEP/CORP стоит по 5 баллов каждый? Тройка — самый новый слой, нужный в основном там, где нужна изоляция процессов (SharedArrayBuffer, защита от Spectre). Сайт без них всё равно имеет основные защиты; с ними некоторым межсайтовым встраиваниям нужна подстройка — поэтому они весят меньше, чем CSP или HSTS.

Значит ли высокая оценка, что сайт безопасен? Нет — она означает, что заголовки ответа выставлены. Заголовки безопасности — один слой: конфигурация TLS, обработка сессий, проверка ввода и обновления по-прежнему решают, безопасен ли сайт на самом деле. Для слоя TLS запустите проверку SSL.

Почему моё значение Permissions-Policy такое длинное? Базовый набор OWASP явно отключает каждую функцию, поэтому новые функции браузера не включатся тихо. Более короткое значение вроде camera=(), microphone=(), geolocation=() — хорошее начало; просто знайте, что оно оставляет включённым.

Можно ли проверить заголовки любого сайта отсюда? Эта страница никогда не делает сетевых запросов — она оценивает ровно тот текст, который вы вставили, поэтому работает за файрволами и на внутренних хостах, и ничего из проверяемого не покидает вашу машину. Получить заголовки можно одной командой curl -sI в терминале.

А что насчёт Clear-Site-Data и X-Permitted-Cross-Domain-Policies? Полезны в узких сценариях (ответы на выход; устаревшие просмотрщики PDF/Flash). Здесь они носят рекомендательный характер и не оцениваются — отправка Clear-Site-Data в каждом ответе стирала бы хранилище пользователей при каждой загрузке страницы.