bitlvl
RU

Анализатор заголовков безопасности HTTP и CSP

Выполните curl -sI https://ваш.сайт/ и вставьте вывод, либо вставьте только CSP. Каждый заголовок объясняется, заголовки безопасности оцениваются с указанием исправления для каждого пробела, а Content-Security-Policy проверяется так, как её прочитал бы злоумышленник. Эта страница ничего не запрашивает; она лишь читает то, что вы вставили.

Получите свои командой: curl -sI https://example.com/ (добавьте -L, чтобы следовать редиректам)

Результаты и сообщения этого инструмента выводятся на английском языке.

Как выглядит хороший набор заголовков

strict-transport-security: max-age=31536000; includeSubDomains; preload
content-security-policy: default-src 'none'; script-src 'self'; style-src 'self'; img-src 'self' data:; font-src 'self'; connect-src 'self'; object-src 'none'; base-uri 'none'; form-action 'self'; frame-ancestors 'none'; upgrade-insecure-requests
x-content-type-options: nosniff
x-frame-options: DENY
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=(), payment=()
cross-origin-opener-policy: same-origin
cross-origin-resource-policy: same-origin

Именно это отправляет этот сайт. Для приложения со встроенными скриптами CSP переходит на nonce: script-src 'nonce-<случайный для каждого ответа>' 'strict-dynamic' — это одновременно строже и проще в поддержке, чем список разрешённых хостов.

Как рассуждает оценка CSP

CSP существует, чтобы ограничить возможности злоумышленника после того, как он нашёл точку внедрения. Поэтому оценка спрашивает: при одной внедрённой строке могут ли выполниться скрипты? 'unsafe-inline' без nonce говорит «да». Wildcard или источник-схема (*, https:, data:) говорит «да». Хост, отдающий скрипты по выбору злоумышленника (публичные CDN со старым AngularJS, JSONP-эндпоинты на googleapis.com, бакеты хранилищ), говорит «да» — вот почему длинный список популярных CDN слабее, чем кажется. Отсутствующие object-src и base-uri — две директивы, о которых забывают и которые снова открывают дверь. Остальные директивы (frame-ancestors, form-action, default-src) важны для кликджекинга и утечки данных, а не для выполнения скриптов, поэтому их вес ниже.

Где задавать заголовки

  • nginx: add_header Name "value" always; — помните, что add_header внутри location отменяет все заголовки уровня server (проверьте с помощью тестера location nginx).
  • Apache: Header always set Name "value" в vhost или .htaccess (mod_headers).
  • Cloudflare: HSTS в SSL/TLS → Edge Certificates; остальные заголовки через Transform Rules → Modify Response Header, что работает и для origin-серверов, которые вы не можете изменить.
  • Фреймворки приложений: helmet (Node), secure_headers (Rails), django-csp, middleware Laravel — они также генерируют nonce для каждого ответа.

Безопасное внедрение CSP

  1. Отправляйте её как Content-Security-Policy-Report-Only с эндпоинтом report-to и неделю наблюдайте за отчётами.
  2. Исправьте реальные нарушения (встроенные обработчики, сторонние виджеты), игнорируйте шум от браузерных расширений.
  3. Смените имя заголовка на Content-Security-Policy. Оставьте report-only для тестирования следующего изменения.

Вопросы

Какие заголовки важнее всего?

Для сайта с любым пользовательским взаимодействием: сначала Content-Security-Policy, затем Strict-Transport-Security и X-Content-Type-Options. Политики фрейминга и referrer добавить дёшево. Остальное — гигиена: скрыть версии, выставить флаги cookie, убрать устаревшие заголовки.

Почему моя CSP оценена как слабая, хотя в ней только доверенные хосты?

Потому что вопрос не в доверии; вопрос в том, можно ли заставить какой-либо скрипт с этих хостов выполнить код злоумышленника. Публичные CDN размещают тысячи версий библиотек, некоторые с известными гаджетами (шаблоны AngularJS, JSONP-колбэки). Политика на основе nonce со strict-dynamic лишена этой проблемы, и эта страница оценивает её как самую сильную конфигурацию.

X-XSS-Protection ещё полезен?

Нет. Chrome удалил XSS auditor в 2019 году, Edge — в 2018; в Firefox его никогда не было. Заголовок безвреден как «0» и был вреден как «1; mode=block» в старых браузерах. Удалите его и используйте CSP.

Как получить заголовки страницы, которая редиректит?

curl -sIL https://example.com/ печатает каждый ответ в цепочке. Вставьте всё; последний ответ оценивается, а редиректы перечисляются. Убедитесь, что http:// перенаправляет на https:// за один переход.

Совпадает ли оценка с securityheaders.com?

Примерно: оба учитывают те же шесть основных заголовков. Эта страница дополнительно оценивает содержимое CSP, а не только её наличие, и снижает балл за утечки и устаревшие заголовки, поэтому сайт со слабой CSP здесь получает оценку ниже.