Как ограничить количество попыток входа в WordPress

Если на сайте регулярно перебирают пароли, ограничение числа попыток входа — один из самых простых и практичных способов снизить риск взлома. Для обычного WordPress-сайта не нужно настраивать серверные правила или писать свой код: чаще всего достаточно поставить плагин, который временно блокирует IP после нескольких неудачных входов и ведёт журнал подозрительной активности.

Сразу оговорюсь: это не заменяет сложные пароли, двухфакторную аутентификацию и актуальные обновления. Но как базовая защита от брутфорса ограничение попыток входа работает хорошо и почти не мешает обычным пользователям.

Что именно нужно ограничивать

В WordPress атака обычно идёт через стандартную форму авторизации /wp-login.php или через AJAX-авторизацию, если тема или плагин добавили собственную форму входа. Смысл защиты простой: после нескольких неудачных попыток система должна временно заблокировать дальнейшие запросы с одного IP или с одной учётной записи, а при повторении — увеличить время блокировки.

На практике полезны три вещи:

  • лимит неудачных попыток за короткий промежуток времени;
  • временная блокировка IP или логина;
  • уведомления о подозрительной активности, если атак слишком много.

Если у вас небольшой сайт, этого обычно достаточно. Для более нагруженных проектов можно дополнить защиту CAPTCHA, двухфакторной аутентификацией и ограничением доступа к админке по IP, но это уже отдельные меры.

Самый простой способ — плагин для ограничения попыток входа

Для большинства сайтов лучший вариант — установить плагин, который специально отвечает за блокировку брутфорса. Это быстрее и безопаснее, чем пытаться собирать защиту вручную. В каталоге WordPress есть несколько рабочих решений, но при выборе смотрите не на количество функций, а на то, умеет ли плагин:

  • блокировать по IP после заданного числа ошибок;
  • задавать время блокировки;
  • вести лог попыток;
  • работать с вашей формой входа, если она нестандартная;
  • не конфликтовать с кэшированием и страницами авторизации.

После установки обычно достаточно открыть настройки плагина и задать порог блокировки. Типичный рабочий сценарий для небольшого сайта — 3–5 неудачных попыток, затем блокировка на 15–60 минут. Если атаки идут постоянно, можно сделать блокировку длиннее, но не стоит сразу ставить слишком жёсткие значения: иногда пользователи сами ошибаются в пароле несколько раз подряд.

Как настроить защиту без лишнего риска

Если плагин позволяет выбрать параметры, ориентируйтесь на такой порядок:

  1. Ограничьте число ошибок входа до 3–5 попыток.
  2. Включите временную блокировку IP.
  3. Поставьте разумный срок блокировки: от 15 минут до часа.
  4. Включите уведомления на почту, если они не спамят при каждой мелкой ошибке.
  5. Проверьте, не блокируется ли администратор при обычной работе с сайтом.

Если на сайте несколько редакторов или авторов, не делайте слишком короткий лимит. Иначе при ошибке в пароле человек сам себя заблокирует и начнёт писать в поддержку. Для корпоративного сайта это особенно неприятно, если вход нужен ежедневно.

Если нужен минимальный код, а не отдельный плагин

Иногда плагин для защиты от брутфорса ставить не хочется, а серверная настройка недоступна. В таком случае можно использовать готовое решение на уровне WordPress-хука, но это уже вариант для тех, кто понимает, как добавлять код в functions.php дочерней темы или в собственный мини-плагин. Такой способ не самый удобный для поддержки, зато он не требует сложной серверной конфигурации.

Ниже пример логики, которая блокирует пользователя после нескольких неудачных попыток входа. Это не полноценная промышленная защита, а базовый шаблон, который показывает принцип работы. Перед использованием обязательно проверьте его на тестовом сайте или в staging-окружении.

add_action('wp_login_failed', function ($username) {
    $ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
    $key = 'login_fail_' . md5($ip);
    $data = get_transient($key);

    if (!is_array($data)) {
        $data = ['count' => 0, 'last' => time()];
    }

    $data['count']++;
    $data['last'] = time();

    set_transient($key, $data, 15 * MINUTE_IN_SECONDS);
});

add_filter('authenticate', function ($user, $username, $password) {
    $ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
    $key = 'login_fail_' . md5($ip);
    $data = get_transient($key);

    if (is_array($data) && !empty($data['count']) && $data['count'] >= 5) {
        return new WP_Error('too_many_attempts', 'Слишком много неудачных попыток входа. Попробуйте позже.');
    }

    return $user;
}, 30, 3);

У этого подхода есть ограничения. Он завязан на IP-адрес, а за NAT или у мобильных операторов один IP может использоваться разными людьми. Кроме того, такой код не даёт полноценного журнала и удобного интерфейса настроек. Поэтому для обычного сайта плагин почти всегда практичнее.

Как проверить, что ограничение попыток работает

После настройки не полагайтесь на предположения. Проверьте защиту вручную:

  1. Откройте страницу входа в приватном окне браузера.
  2. Введите неверный пароль несколько раз подряд.
  3. Убедитесь, что после заданного лимита сайт перестаёт принимать попытки и показывает сообщение о блокировке.
  4. Проверьте, приходит ли уведомление администратору, если вы его включили.
  5. Попробуйте войти с правильным паролем после окончания времени блокировки.

Если блокировка не срабатывает, причина обычно одна из трёх: плагин не поддерживает вашу форму входа, кэш или прокси скрывает реальный IP, либо защита конфликтует с другим плагином авторизации. В таком случае сначала проверьте, не используется ли отдельная форма входа от темы, конструктора или membership-плагина.

На что обратить внимание, чтобы не заблокировать своих пользователей

Самая частая ошибка — слишком жёсткий лимит. Если поставить 1–2 попытки и длинную блокировку, вы создадите проблемы реальным людям. Ещё одна типичная ситуация — защита по IP в офисе или в мобильной сети: один неудачный вход может повлиять на других пользователей, если они выходят в интернет через общий адрес.

Поэтому для большинства сайтов разумнее начинать с мягкой настройки и смотреть на журнал событий. Если видите много атак с одних и тех же адресов, можно ужесточить правила. Если же в логах много обычных ошибок от своих сотрудников, лимит лучше ослабить и добавить двухфакторную аутентификацию для админов.

И ещё один практический момент: если у вас включён кэш на уровне сервера или CDN, не кэшируйте страницу входа. Это не относится напрямую к лимиту попыток, но без этого защита и сама форма авторизации могут вести себя нестабильно.

Что выбрать в итоге

Если нужен быстрый и надёжный способ без лишней возни, ставьте плагин для ограничения попыток входа. Это лучший вариант для большинства сайтов на WordPress: он не требует правок сервера, легко настраивается и позволяет сразу увидеть, кто и как часто пытается подобрать пароль.

Если у вас есть разработчик и нужен полностью кастомный сценарий, можно реализовать базовую блокировку через хук WordPress, но для поддержки и диагностики это менее удобно. В любом случае ограничение попыток входа стоит рассматривать как обязательный минимум для сайта, который уже сталкивался с подбором паролей или подозрительной активностью в форме авторизации.

⭐⭐⭐⭐⭐