Угон сессий и куки — одна из актуальных проблем безопасности WordPress-сайтов, особенно если на них есть пользователи с правами администратора или редактора. Вредоносный пользователь, получивший доступ к сессии, может легко обойти аутентификацию и получить полный контроль над сайтом. В этой статье разберем, как защитить WordPress от угона сессий и куки, используя проверенные техники и примеры кода.
Почему угон сессий и куки опасен для WordPress
WordPress использует куки и сессии для идентификации пользователей после входа в систему. Если злоумышленник перехватывает эти данные, он может получить доступ к аккаунту пользователя без повторной аутентификации. Это ставит под угрозу безопасность сайта и данные пользователей.
Основные причины угона сессий и куки на WordPress:
- Использование незащищённого HTTP вместо HTTPS, что позволяет перехватывать куки через сетевые атаки.
- Уязвимости в плагинах и темах, которые могут раскрывать сессионные данные.
- Отсутствие защиты от Cross-Site Scripting (XSS), позволяющего украсть куки из браузера пользователя.
Чтобы минимизировать риски, нужно применять комплексный подход.
Настройка защищённых куки в WordPress
Куки, используемые WordPress, можно сделать более безопасными, установив флаги Secure и HttpOnly. Флаг Secure гарантирует, что куки передаются только по HTTPS, а HttpOnly предотвращает доступ к куки через JavaScript.
По умолчанию WordPress уже устанавливает HttpOnly для некоторых куки, но можно усилить защиту, добавив следующий код в файл functions.php вашей темы или в собственный плагин:
add_filter('send_auth_cookies', 'wpprotect_secure_auth_cookies');
function wpprotect_secure_auth_cookies() {
if ( is_ssl() ) {
// Устанавливаем флаг Secure для куки авторизации
@setcookie(
LOGGED_IN_COOKIE,
wp_generate_auth_cookie(get_current_user_id(), time() + 3600, 'logged_in'),
time() + 3600,
COOKIEPATH,
COOKIE_DOMAIN,
true, // Secure
true // HttpOnly
);
}
}
Этот фильтр гарантирует, что при использовании SSL куки авторизации будут передаваться только по HTTPS и не доступны через JS.
Защита от XSS и проверка nonce
Очень важно предотвратить XSS-атаки, которые позволяют украсть куки из браузера пользователя. Для этого:
- Используйте экранирование данных при выводе (функции
esc_html(),esc_attr()и другие). - Проверяйте nonce в своих формах и AJAX-запросах, чтобы убедиться, что запросы исходят с вашего сайта.
Пример создания и проверки nonce в AJAX запросе:
// Создание nonce и вывод в JS
function wpprotect_enqueue_script() {
wp_enqueue_script('wpprotect-script', plugin_dir_url(__FILE__) . 'js/script.js', array('jquery'), null, true);
wp_localize_script('wpprotect-script', 'wpprotect_ajax', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('wpprotect_nonce')
));
}
add_action('wp_enqueue_scripts', 'wpprotect_enqueue_script');
// Обработка AJAX запроса
function wpprotect_handle_ajax() {
check_ajax_referer('wpprotect_nonce', 'nonce');
// Ваш код
wp_send_json_success('Данные обработаны');
}
add_action('wp_ajax_wpprotect_action', 'wpprotect_handle_ajax');
add_action('wp_ajax_nopriv_wpprotect_action', 'wpprotect_handle_ajax');
Ограничение сессий и автоматический выход
Чтобы снизить риск угона сессии, полезно ограничить время жизни сессии и реализовать автоматический выход пользователя после определенного времени бездействия. WordPress по умолчанию устанавливает срок действия куки авторизации — 48 часов для обычного входа и 14 дней при выборе "Запомнить меня".
Вы можете уменьшить время жизни сессии через фильтр:
add_filter('auth_cookie_expiration', 'wpprotect_shorter_auth_cookie_expiration', 99, 3);
function wpprotect_shorter_auth_cookie_expiration($length, $user_id, $remember) {
if ($remember) {
// 1 день для "Запомнить меня"
return DAY_IN_SECONDS;
} else {
// 2 часа для обычного входа
return 2 * HOUR_IN_SECONDS;
}
}
Для автоматического выхода после бездействия можно использовать плагин Clearfy Pro, который добавляет расширенные настройки сессий и безопасности.
Использование плагинов для защиты сессий и куки
Рассмотрим несколько плагинов, которые помогают защитить WordPress от угона сессий и куки:
- Clearfy Pro — расширяет защиту, позволяет ограничивать количество одновременных сессий для одного пользователя, автоматически завершать сессии при смене пароля и многое другое.
- WP Cerber Security — защищает от взлома сессий, блокирует подозрительные IP, имеет защиту от брутфорса и XSS.
- Loginizer — ограничивает попытки входа, блокирует IP, что снижает вероятность компрометации куки через подбор пароля.
Эти плагины можно эффективно комбинировать для создания многоуровневой защиты.
Как обнаружить и заблокировать подозрительные сессии
Администраторы могут отслеживать активные сессии пользователей и удалять подозрительные. WordPress 4.0 и выше поддерживает управление сессиями через API.
Пример удаления всех сессий пользователя, кроме текущей:
function wpprotect_logout_other_sessions() {
if ( is_user_logged_in() ) {
$user_id = get_current_user_id();
$manager = WP_Session_Tokens::get_instance( $user_id );
$manager->destroy_all(); // Удаляет все сессии
// Можно оставить текущую сессию, вызвав только destroy_other_sessions()
}
}
Также можно добавить интерфейс для администраторов, чтобы отслеживать и завершать сессии вручную.
Дополнительные рекомендации по защите сессий
Помимо вышеперечисленных методов, обратите внимание на следующие практики:
- Обязательно используйте HTTPS на всем сайте для защиты данных при передаче.
- Регулярно обновляйте WordPress, темы и плагины, чтобы закрывать уязвимости.
- Применяйте двухфакторную аутентификацию (2FA) для пользователей с правами администратора.
- Ограничивайте доступ к админке по IP или через VPN, если это возможно.
- Проверяйте логи входов и сессий на предмет подозрительной активности.
Хорошим решением будет интеграция 2FA через плагин WPGPT, который помимо прочего позволяет внедрять дополнительные уровни безопасности.
Выводы
Защита WordPress от угона сессий и куки требует комплексного подхода: настройка защищённых куки, предотвращение XSS, ограничение времени сессий, использование надежных плагинов и регулярный мониторинг. Приведенные в статье примеры кода и рекомендации помогут вам существенно снизить риски и обезопасить сайт от компрометации.