wpmake.ru wordpress WPMake

Как сделать защиту от bruteforce-атак в WordPress без плагинов

Диагностика проблемы: как понять, что сайт под угрозой bruteforce-атаки

Bruteforce-атака — это массовая попытка подобрать правильные логин и пароль для входа в админку WordPress. Признаки проблемы:

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

Для проверки можно посмотреть логи сервера или использовать команду на сервере (если есть SSH):

grep "POST /wp-login.php" /var/log/apache2/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -20

Она покажет IP-адреса с наибольшим числом попыток входа.

Пошаговое решение: ограничение количества попыток входа через .htaccess и functions.php

Шаг 1. Ограничение доступа к wp-login.php через .htaccess по IP

Если у вас статический IP или фиксированный набор IP-адресов администраторов, можно ограничить доступ:

# В корне сайта в файл .htaccess добавьте:
<Files wp-login.php>
    Order Deny,Allow
    Deny from all
    Allow from 123.45.67.89
</Files>

Замените 123.45.67.89 на ваш IP. Это самый надежный способ, но не всегда применим.

Шаг 2. Ограничение попыток входа через код в functions.php

Добавим код, который будет блокировать IP с более чем N неудачными попытками входа за определённое время.

function limit_login_attempts() {
    session_start();
    $max_attempts = 5;
    $lockout_time = 15 * 60; // 15 минут

    if (!isset($_SESSION['login_attempts'])) {
        $_SESSION['login_attempts'] = 0;
        $_SESSION['last_attempt_time'] = time();
    }

    if (time() - $_SESSION['last_attempt_time'] > $lockout_time) {
        $_SESSION['login_attempts'] = 0;
    }

    if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['log'])) {
        if ($_SESSION['login_attempts'] >= $max_attempts) {
            wp_die('Слишком много неудачных попыток входа. Попробуйте позже.');
        }

        add_action('wp_login_failed', function() {
            $_SESSION['login_attempts']++;
            $_SESSION['last_attempt_time'] = time();
        });

        add_action('wp_login', function() {
            $_SESSION['login_attempts'] = 0; // сброс при успешном входе
        });
    }
}
add_action('init', 'limit_login_attempts');

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

Шаг 3. Блокировка IP через fail2ban (на сервере)

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

  • Создайте фильтр для wp-login.php в /etc/fail2ban/filter.d/wordpress.conf
  • Добавьте правило в /etc/fail2ban/jail.local
  • Перезапустите сервис fail2ban

Это значительно эффективнее, но требует доступа к серверу и понимания работы fail2ban.

Проверка результата после внедрения

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

Частые ошибки и как их исправить

  • Ошибка: сессии не работают, и ограничения не срабатывают.
    Причина: сессии не инициализированы в WordPress по умолчанию.
    Решение: добавить session_start() в хук init или использовать transient API для хранения попыток.
  • Ошибка: блокировка мешает легитимным пользователям.
    Причина: слишком жесткие лимиты или нестабильный IP.
    Решение: увеличьте количество попыток или время блокировки.
  • Ошибка: IP-ограничение через .htaccess не работает.
    Причина: конфликт с другими правилами или неправильный синтаксис.
    Решение: проверьте порядок правил и используйте правильный синтаксис для версии Apache.

Практические советы по безопасности и производительности

  • Используйте сложные пароли и двухфакторную аутентификацию вместо простых ограничений.
  • Регулярно обновляйте WordPress и плагины, чтобы закрыть известные уязвимости.
  • Для сайтов с высокой нагрузкой лучше использовать серверные инструменты (fail2ban, firewall) для защиты от bruteforce, а не только PHP-код.
  • Рассмотрите использование Cloudflare или другого CDN с функцией Web Application Firewall для дополнительной защиты.

Сравнение способов защиты от bruteforce-атак

МетодПлюсыМинусыКогда использовать
Ограничение по IP в .htaccessОчень надежно, блокирует до входа в WordPressТребуются статические IP, неудобно для динамическихДля админов с фиксированным IP
Код в functions.php (сессии)Просто реализовать, работает сразуЛегко обойти сменой браузера и IPДля базовой защиты, когда нет доступа к серверу
Fail2ban на сервереЭффективно блокирует на уровне сервера, не нагружает WordPressТребуется доступ к серверу и навыки администрированияДля крупных проектов и VPS/выделенных серверов

Если вам нужна комплексная SEO-оптимизация и чистка сайта после атак, рассмотрите плагин Clearfy Pro от WPShop — он поможет оптимизировать производительность и убрать мусор.

×
Сделай свой сайт крутым!

Скидка -20% на премиум плагины WordPress

Выбрать плагин сейчас ⋙