Ограничение числа попыток входа — один из эффективных способов защитить WordPress-сайт от атак грубой силы (brute force). Обычно для этого используют популярные плагины, такие как Limit Login Attempts Reloaded или WP Cerber. Однако иногда хочется обойтись без сторонних расширений, чтобы не нагружать сайт и сохранить полный контроль над процессом.
Почему важно ограничивать число попыток входа
При злоумышленных атаках боты перебирают пароли, пытаясь войти под администратором или другими пользователями. Если не ограничивать попытки, можно получить взлом сайта, потерю данных и репутационные риски. Ограничение попыток защищает от таких сценариев, блокируя IP-адреса после нескольких неудачных входов.
Реализация ограничения попыток входа в WordPress через код
Мы реализуем функционал, который будет считать неудачные попытки входа с одного IP и блокировать дальнейшие попытки на определённый период. Для этого используем transient API WordPress, чтобы хранить данные во временном кэше, и хуки, чтобы отследить процесс авторизации.
Шаг 1. Отслеживание неудачных попыток
Используем хук wp_login_failed, который срабатывает при ошибочном входе. В обработчике будем увеличивать счётчик попыток для текущего IP.
function wplogin_inc_login_attempts( $username ) {
$ip = $_SERVER['REMOTE_ADDR'];
$attempts = (int) get_transient( 'wplogin_login_attempts_' . $ip );
$attempts++;
set_transient( 'wplogin_login_attempts_' . $ip, $attempts, 15 * MINUTE_IN_SECONDS );
}
add_action( 'wp_login_failed', 'wplogin_inc_login_attempts' );
Здесь мы увеличиваем счётчик попыток для IP и сохраняем его на 15 минут.
Шаг 2. Блокировка попыток после превышения лимита
Прежде чем WordPress начнёт обработку входа, проверим, не превышено ли число попыток. Для этого используем фильтр authenticate, который позволяет прервать процесс авторизации с ошибкой.
function wplogin_block_after_limit( $user, $username, $password ) {
$ip = $_SERVER['REMOTE_ADDR'];
$attempts = (int) get_transient( 'wplogin_login_attempts_' . $ip );
$max_attempts = 5; // Максимум попыток
if ( $attempts >= $max_attempts ) {
return new WP_Error( 'too_many_attempts', __('<strong>Ошибка:</strong> Слишком много неудачных попыток входа. Попробуйте позже.') );
}
return $user;
}
add_filter( 'authenticate', 'wplogin_block_after_limit', 30, 3 );
Если попыток больше или равно 5, пользователь получает ошибку и вход блокируется.
Шаг 3. Очистка счётчика при успешном входе
После успешной авторизации нужно сбросить счётчик попыток, чтобы не блокировать пользователя в будущем.
function wplogin_reset_login_attempts( $user_login, $user ) {
$ip = $_SERVER['REMOTE_ADDR'];
delete_transient( 'wplogin_login_attempts_' . $ip );
}
add_action( 'wp_login', 'wplogin_reset_login_attempts', 10, 2 );
Тонкости и улучшения кода
В представленном коде счётчик основан на IP-адресе, что удобно, но может создавать проблемы для пользователей с динамическими IP или при использовании прокси. В продакшн-решениях можно расширить логику, учитывая имя пользователя и хранить данные в базе для большей устойчивости.
Также можно добавить оповещения администратору при блокировке и интегрировать с такими плагинами, как Clearfy Pro, которые помогают оптимизировать безопасность сайта.
Заключение
Таким образом, без установки плагинов можно реализовать базовое ограничение по числу попыток входа для повышения безопасности WordPress. Этот способ подходит для небольших проектов, где важна легковесность и контроль над кодом. Для более продвинутых задач рекомендуются специализированные плагины.