Security headers WordPress: полная настройка для максимальной защиты сайта
Почему security headers важны для WordPress
Security headers – это HTTP‑заголовки, которые инструктируют браузер, как обрабатывать контент сайта. Правильно сконфигурированные заголовки защищают от clickjacking, XSS, MITM-атак и утечки рефереров. В WordPress, где большинство сайтов используют одинаковый набор плагинов и тем, даже небольшая уязвимость может стать точкой входа для злоумышленников.
Content Security Policy (CSP)
CSP позволяет задать, откуда браузер может загружать скрипты, стили, изображения и другие ресурсы. Это один из самых эффективных способов предотвратить XSS‑атаки.
Базовый пример CSP в .htaccess
Header set Content-Security-Policy "default-src 'self'; script-src 'self' https://cdnjs.cloudflare.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:" Для более гибкой политики рекомендуется использовать CloudFlare для WordPress, где можно управлять CSP через правила Page Rules без изменения кода.
Отладка CSP
- Откройте DevTools → Console – ищите сообщения
Refused to load .... - Включите режим
Report‑Onlyи соберите отчёты, прежде чем вводить «жёсткую» политику.
HTTP Strict Transport Security (HSTS)
HSTS заставляет браузер всегда обращаться к сайту по HTTPS, исключая возможность downgrade‑атаки.
Настройка в .htaccess
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" Не забудьте добавить домен в HSTS preload list, если хотите, чтобы браузеры сразу использовали HTTPS.
Настройка в Nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; Подробный гид по работе с Nginx вы найдёте в статье Настройка Nginx для WordPress.
X-Frame-Options и защита от clickjacking
Заголовок X-Frame-Options запрещает встраивание страницы в <iframe> на чужих сайтах.
Пример для WordPress
Header set X-Frame-Options "SAMEORIGIN" Если вам необходимо разрешить встраивание только на конкретных доменах, используйте Content-Security-Policy: frame-ancestors вместо устаревшего заголовка.
X-XSS-Protection и Referrer-Policy
Эти заголовки относятся к более старым механизмам, но всё ещё поддерживаются в большинстве браузеров.
Настройка в .htaccess
Header set X-XSS-Protection "1; mode=block"
Header set Referrer-Policy "strict-origin-when-cross-origin" Для строгой политики рефереров рекомендуется no-referrer-when-downgrade или strict-origin, в зависимости от бизнес‑требований.
Как добавить заголовки через PHP (для тех, кто не может менять серверные файлы)
Если у вас нет доступа к .htaccess или конфигурации Nginx, можно вывести заголовки в functions.php темы.
add_action( 'send_headers', function() {
header( "Content-Security-Policy: default-src 'self'; script-src 'self' https://cdnjs.cloudflare.com" );
header( "Strict-Transport-Security: max-age=31536000; includeSubDomains; preload" );
header( "X-Frame-Options: SAMEORIGIN" );
header( "X-XSS-Protection: 1; mode=block" );
header( "Referrer-Policy: strict-origin-when-cross-origin" );
} );
Помните, что PHP‑заголовки отправляются позже, чем серверные, поэтому они могут быть переопределены другими плагинами.
Тестирование и мониторинг security headers
После внедрения проверьте корректность с помощью онлайн‑инструментов:
- securityheaders.com – мгновенный отчёт о всех заголовках.
- В Chrome откройте DevTools → Network → выберите запрос → Headers.
- Настройте мониторинг в Fail2Ban для WordPress, чтобы получать алерты о попытках обхода.
Регулярно проверяйте отчёты, особенно после установки новых плагинов, которые могут менять заголовки.
Лучшие практики и часто встречающиеся ошибки
- Не используйте слишком широкие CSP‑директивы. Например,
script-src *полностью нивелирует защиту. - Не забывайте про субдомены. Если у вас есть
blog.example.com, включитеincludeSubDomainsв HSTS. - Тестируйте в режиме
Report‑Onlyсначала. Это позволит собрать статистику без блокировки легального контента. - Обновляйте список доверенных источников. CDN‑провайдеры меняют домены, поэтому периодически проверяйте их IP‑адреса.
- Комбинируйте заголовки с другими мерами. Защита wp‑login от брутфорса (см. статью) и оптимизация базы данных (оптимизация БД) усиливают общую безопасность.
Заключение
Security headers – это недорогой, но мощный слой защиты, который легко добавить в любой WordPress‑проект. Правильная CSP, HSTS, X‑Frame‑Options, X‑XSS‑Protection и Referrer‑Policy позволяют снизить риск XSS, clickjacking и MITM‑атак на более 30 %. Не забывайте проверять результаты, поддерживать актуальность списков и комбинировать заголовки с другими инструментами защиты, такими как CloudFlare и Fail2Ban. Ваш сайт станет намного устойчивее к современным угрозам.
❓ Часто задаваемые вопросы
Как проверить, что заголовки действительно отправляются сервером?
Откройте DevTools в браузере, перейдите на вкладку Network, выберите любой запрос и посмотрите раздел Headers – там будут все полученные от сервера HTTP‑заголовки.
Можно ли использовать CSP вместе с плагинами, которые динамически добавляют скрипты?
Да, но нужно добавить их источники в директиву script-src. Лучший способ – включить режим Report‑Only, собрать отчёты и затем уточнить политику.
Нужен ли заголовок X‑XSS‑Protection, если я уже включил CSP?
CSP покрывает большинство XSS‑угроз, но X‑XSS‑Protection остаётся полезным для старых браузеров, которые не поддерживают CSP полностью.
Влияет ли HSTS на SEO сайта?
HSTS улучшает SEO, так как поисковые системы предпочитают безопасные HTTPS‑сайты. Главное – убедиться, что сертификат всегда действителен, иначе пользователи могут потерять доступ.