Вопрос безопасности авторизации в WordPress остаётся актуальным и требует комплексных решений. Одной из важных мер защиты является ограничение количества попыток входа, что помогает снизить риск brute force атак. В этой статье мы разберём, как создать собственный плагин для ограничения попыток входа в WordPress, без использования сторонних решений.
Почему важно ограничивать количество попыток входа
Brute force атаки представляют собой автоматические переборы паролей, которые могут привести к взлому сайта. По умолчанию WordPress не ограничивает количество попыток входа, что делает сайт уязвимым.
Ограничение попыток входа помогает:
- Защитить сайт от автоматических переборов паролей.
- Снизить нагрузку на сервер при атаках.
- Повысить общую безопасность и доверие пользователей.
Существуют готовые плагины, например, Clearfy Pro, которые реализуют это на высоком уровне, но иногда важно иметь своё, кастомное решение под свои нужды.
Создание кастомного плагина для ограничения попыток входа
Основная идея решения
Мы будем хранить в базе данных количество неудачных попыток входа для каждого IP-адреса и блокировать дальнейшие попытки после достижения лимита на определённый промежуток времени.
Такой подход защищает от большого количества попыток с одного IP, при этом не мешает другим пользователям.
Шаг 1. Создаём структуру плагина
Создайте папку wpauth-login-limit в директории wp-content/plugins. В ней создайте файл wpauth-login-limit.php и добавьте в начало стандартный заголовок плагина:
<?php
/*
Plugin Name: WPAUTH Login Limit
Description: Ограничение количества попыток входа в WordPress
Version: 1.0
Author: WPAUTH
*/
Шаг 2. Реализация логики ограничения попыток
Мы используем хуки WordPress для перехвата попыток входа и проверки количества ошибок.
Добавим обработчик на хук wp_authenticate_user, который вызывается во время попытки авторизации:
add_filter('wp_authenticate_user', 'wpauth_limit_login_attempts', 10, 2);
function wpauth_limit_login_attempts($user, $password) {
$ip = wpauth_get_user_ip();
$max_attempts = 5; // Максимум попыток
$lockout_time = 15 * 60; // Время блокировки в секундах (15 минут)
$attempts = get_transient('wpauth_login_attempts_' . $ip);
if ($attempts && $attempts['count'] >= $max_attempts) {
$time_left = $attempts['last_fail'] + $lockout_time - time();
if ($time_left > 0) {
return new WP_Error('too_many_attempts', sprintf('Слишком много попыток входа. Повторите через %d минут.', ceil($time_left / 60)));
} else {
// Сброс после времени блокировки
delete_transient('wpauth_login_attempts_' . $ip);
}
}
if (is_wp_error($user)) {
// Ошибка авторизации – увеличиваем счётчик
if (!$attempts) {
$attempts = ['count' => 1, 'last_fail' => time()];
} else {
$attempts['count']++;
$attempts['last_fail'] = time();
}
set_transient('wpauth_login_attempts_' . $ip, $attempts, $lockout_time);
} else {
// Успешный вход – сбрасываем счётчик
delete_transient('wpauth_login_attempts_' . $ip);
}
return $user;
}
function wpauth_get_user_ip() {
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
return $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip_list = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
return trim($ip_list[0]);
} else {
return $_SERVER['REMOTE_ADDR'];
}
}
Объяснение кода
Функция wpauth_limit_login_attempts получает IP пользователя и проверяет наличие количества ошибок в transient — временном кэше WordPress.
Если количество попыток превышено, и время блокировки не истекло — возвращается ошибка, которая прерывает авторизацию.
Если попытка неудачная — увеличиваем счётчик, если успешная — сбрасываем.
Как расширить функционал плагина
Добавление уведомления администратора
Можно добавить отправку email администратору при блокировке IP:
function wpauth_notify_admin_on_lockout($ip) {
$admin_email = get_option('admin_email');
$subject = 'Блокировка IP из-за превышения попыток входа';
$message = "IP адрес $ip был заблокирован на 15 минут из-за слишком большого количества неудачных попыток входа.";
wp_mail($admin_email, $subject, $message);
}
// Вызов этой функции добавить в условие блокировки
if ($time_left > 0) {
wpauth_notify_admin_on_lockout($ip);
return new WP_Error('too_many_attempts', sprintf('Слишком много попыток входа. Повторите через %d минут.', ceil($time_left / 60)));
}
Логирование попыток
Для аудита можно сохранять попытки входа в отдельную таблицу базы данных или в файл, что поможет анализировать атаки.
Интеграция с плагинами безопасности
Если вы используете Clearfy Pro или другие решения из WPShop.ru, можно дополнительно расширять функционал или использовать их API для более комплексной защиты.
Тестирование и отладка плагина
После установки активируйте плагин и выполните следующие проверки:
- Попробуйте войти с неправильным паролем 5 раз — должна появиться ошибка блокировки.
- Подождите 15 минут и попробуйте снова — блокировка должна сняться.
- Попробуйте войти с правильным паролем — счётчик сбрасывается.
Для отладки используйте error_log и WP_DEBUG.
Выводы и рекомендации
Создание собственного плагина для ограничения попыток входа позволяет гибко настраивать параметры и интегрировать защиту в существующий функционал сайта. Такой подход подходит для проектов с особыми требованиями безопасности.
При этом не забывайте про комплексные меры защиты: двухфакторную аутентификацию, использование надежных паролей и регулярные обновления WordPress и плагинов.