Диагностика проблемы безопасности форм WPForms
WPForms — популярный плагин для создания форм в WordPress. Однако по умолчанию он не настраивает HTTP-заголовки безопасности, которые помогают защитить сайт от различных атак (XSS, Clickjacking, MIME sniffing и др.). Это особенно важно при работе с формами, где обрабатываются пользовательские данные.
Для диагностики текущих заголовков можно использовать инструмент браузера (вкладка Network → Response Headers) или онлайн-сервисы типа securityheaders.com. Если вы не видите заголовков Content-Security-Policy, X-Content-Type-Options, X-Frame-Options или Strict-Transport-Security, значит необходимо их добавить.
Пошаговое решение: как добавить заголовки безопасности Spring Security в WordPress с WPForms
1. Добавление заголовков через functions.php темы
Самый простой способ — добавить нужные заголовки в файл functions.php активной темы. Ниже пример кода, который добавляет базовые заголовки безопасности:
function wpforms_add_security_headers() {
// Запретить отображение сайта в iframe (Clickjacking)
header('X-Frame-Options: SAMEORIGIN');
// Отключить MIME sniffing
header('X-Content-Type-Options: nosniff');
// Запретить выполнение скриптов из недоверенных источников
header("Content-Security-Policy: default-src 'self'; script-src 'self' https://ajax.googleapis.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:;");
// Включить HSTS для HTTPS
header('Strict-Transport-Security: max-age=31536000; includeSubDomains');
}
add_action('send_headers', 'wpforms_add_security_headers');2. Ограничение заголовков только к страницам с WPForms
Если хотите добавить заголовки только для страниц с формами WPForms (чтобы не ломать другие части сайта), нужно определить, есть ли форма на странице:
function wpforms_add_security_headers_conditional() {
if (function_exists('wpforms_display')) {
global $post;
if (isset($post->post_content) && has_shortcode($post->post_content, 'wpforms')) {
header('X-Frame-Options: SAMEORIGIN');
header('X-Content-Type-Options: nosniff');
header("Content-Security-Policy: default-src 'self'; script-src 'self' https://ajax.googleapis.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:;");
header('Strict-Transport-Security: max-age=31536000; includeSubDomains');
}
}
}
add_action('send_headers', 'wpforms_add_security_headers_conditional');Проверка результата после внедрения
После добавления кода:
- Очистите кеш браузера и сайта (если используется кеширование).
- Откройте любую страницу с формой WPForms.
- В инструментах разработчика браузера перейдите во вкладку Network, выберите запрос к странице и посмотрите Response Headers.
- Должны присутствовать заголовки:
X-Frame-Options: SAMEORIGINX-Content-Type-Options: nosniffContent-Security-Policyс настройками по умолчаниюStrict-Transport-Security
Для полной проверки можно использовать https://securityheaders.com и ввести URL своего сайта.
Частые ошибки и как исправить
- Заголовки не отображаются: Возможно, код добавлен в неправильное место, либо сервер/плагины блокируют добавление заголовков. Проверьте, что
add_action('send_headers', ...)подключён корректно и не вызывается раньше отправки заголовков. - Конфликт с кешированием: Кеширующие плагины или CDN могут отдавать старые заголовки. Очистите кеш и проверьте снова.
- Контент-Безопасная политика слишком строгая: Если у вас есть внешние скрипты, стили или картинки, их нужно добавить в CSP. Иначе браузер заблокирует загрузку ресурсов.
- HSTS на HTTP-сайте: Заголовок Strict-Transport-Security применим только при HTTPS; на HTTP сайте его лучше не добавлять.
Практические советы по безопасности и производительности
- Используйте заголовки безопасности для защиты от самых частых атак.
- Тестируйте Content-Security-Policy, начиная с мягких настроек, постепенно усиливая.
- Для сложных CSP рассмотрите специализированные плагины безопасности, например, HTTP Headers.
- Добавляйте заголовки только к нужным страницам, чтобы снизить вероятность конфликтов.
- Не забывайте про SSL — заголовок HSTS работает только с HTTPS.