Руководства

Как исправить заголовки безопасности (CSP, HSTS)

Отсутствие заголовков безопасности подвергает веб-приложения атакам межсайтового скриптинга (XSS), кликджекингу, понижению протокола и утечке учетных данных. Их устранение требует настройки веб-сервера и точного задания директив.

Короткий ответ

Внедрите Strict-Transport-Security со сроком один год и preload, настройте строгий Content-Security-Policy для скриптов и фреймов, добавьте X-Content-Type-Options: nosniff, задайте frame-ancestors 'none' и Referrer-Policy.

Диагностика отсутствующих заголовков ответа

Перед изменением конфигурации веб-сервера проверьте текущие заголовки ответа с помощью curl -IL или автоматизированного сканера. Определите, на каком уровне завершается TLS и формируются заголовки: на основном веб-сервере (Nginx, Apache), в обратном прокси или на границе CDN. Убедитесь, что заголовки безопасности не удаляются промежуточными прокси-серверами и не перезаписываются middleware бекенда.

Безопасная настройка Strict-Transport-Security (HSTS)

Заголовок HSTS предписывает браузеру обращаться к сайту исключительно по протоколу HTTPS, предотвращая атаки типа SSL stripping. Начните тестирование со значения Strict-Transport-Security: max-age=86400 (один день). После подтверждения доступности всех поддоменов увеличьте параметр до промышленного уровня: max-age=31536000; includeSubDomains; preload. Никогда не указывайте max-age=0 в рабочей среде, так как по стандарту RFC 6797 это обнуляет политику защиты.

Построение строгой Content Security Policy (CSP)

CSP ограничивает источники загрузки и выполнения скриптов в браузере. Для безопасного внедрения используйте заголовок Content-Security-Policy-Report-Only с директивой report-to, чтобы логировать нарушения без блокировки легитимных скриптов пользователей. Задайте default-src 'self', script-src 'self' с одноразовыми nonces или SHA-256 хешами вместо 'unsafe-inline' и 'unsafe-eval', запретите плагины object-src 'none' и задайте frame-ancestors 'none'. После проверки переведите CSP в боевой режим.

Защита от кликджекинга, MIME-sniffing и утечки реферера

Защитите пользовательские сессии от встраивания в скрытые iframe с помощью директивы frame-ancestors 'none' в CSP и резервного заголовка X-Frame-Options: DENY для устаревших браузеров. Предотвратите интерпретацию неисполняемых файлов как скриптов директивой X-Content-Type-Options: nosniff. Ограничьте утечку путей и параметров URL при внешних переходах заголовком Referrer-Policy: strict-origin-when-cross-origin.

Внедрение на веб-сервере и проверка

В Nginx директивы задаются в блоке server HTTPS с помощью директивы add_header с флагом always (например: add_header X-Content-Type-Options "nosniff" always;), чтобы они отправлялись даже при ошибках 4xx и 5xx. В Apache используйте директивы Header always set модуля mod_headers. После обновления конфигов перезагрузите сервер (nginx -t && systemctl reload nginx) и проверьте сайт внешним аудитом заголовков безопасности.

Заголовки безопасности: HTTPS, CSP, защита фреймов, MIME, referrer и изоляция браузера.

Запустить бесплатный аудит →

Вопросы

Часто задаваемые вопросы

Можно ли сразу включить HSTS preload для рабочего домена?

Нет. Сначала протестируйте Strict-Transport-Security с max-age=86400 (один день) и убедитесь, что все поддомены и API работают по HTTPS, прежде чем отправлять домен в список hstspreload.org с max-age=31536000.

Как внедрить Content Security Policy без риска сломать сторонние скрипты?

Сначала включите заголовок Content-Security-Policy-Report-Only для логирования нарушений, определите все необходимые домены и используйте nonce или хеши для скриптов перед переводом в боевой режим.