PHP
#wordpress#php#security#login#rate-limit#nginx#brute-force

Защита wp-login: ограничение попыток входа и rate-limit

Надёжная защита wp-login.php через ограничение попыток входа и rate-limit через nginx или WordPress hooks.

Как использовать

  1. Скопируйте нужный фрагмент кода.
  2. Вставьте в свой проект и при необходимости измените под задачу.
  3. Проверьте зависимости и окружение (версии, переменные).

Защита от брутфорса через ограничение попыток входа и rate-limit. Используйте комбинацию WordPress hooks и nginx для максимальной защиты.

// В functions.php: ограничение попыток входа
function limit_login_attempts() {
    $ip = $_SERVER['REMOTE_ADDR'];
    $transient_key = 'login_attempts_' . md5($ip);
    $attempts = get_transient($transient_key);
    $max_attempts = 5;
    $lockout_time = 900; // 15 минут
    
    if ($attempts === false) {
        $attempts = 0;
    }
    
    if ($attempts >= $max_attempts) {
        wp_die(
            'Слишком много попыток входа. Попробуйте через ' . round($lockout_time / 60) . ' минут.',
            'Доступ заблокирован',
            ['response' => 429]
        );
    }
}

// Увеличиваем счётчик при неудачной попытке
function increment_login_attempts($username) {
    $ip = $_SERVER['REMOTE_ADDR'];
    $transient_key = 'login_attempts_' . md5($ip);
    $lockout_time = 900;
    $attempts = get_transient($transient_key) ?: 0;
    set_transient($transient_key, $attempts + 1, $lockout_time);
}
add_action('wp_login_failed', 'increment_login_attempts');

// Сбрасываем при успешном входе
function reset_login_attempts($user_login, $user) {
    $ip = $_SERVER['REMOTE_ADDR'];
    $transient_key = 'login_attempts_' . md5($ip);
    delete_transient($transient_key);
}
add_action('wp_login', 'reset_login_attempts', 10, 2);

// Проверяем попытки перед показом формы логина
add_action('login_init', 'limit_login_attempts');

// Дополнительно: скрыть ошибки логина
add_filter('login_errors', function() {
    return 'Неверные учётные данные.';
});

Nginx конфигурация (добавить в server block):

# Rate limit для wp-login.php
limit_req_zone $binary_remote_addr zone=wp_login:10m rate=5r/m;

location = /wp-login.php {
    limit_req zone=wp_login burst=2 nodelay;
    
    # Блокировка по IP (опционально, через fail2ban лучше)
    # deny 1.2.3.4;
    
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

Usage:

Добавьте PHP код в functions.php. Nginx конфигурацию добавьте в блок server {} вашего сайта и перезагрузите nginx: nginx -t && systemctl reload nginx.

Notes:

⚠️ Для продакшена используйте плагин типа “Wordfence” или “Limit Login Attempts Reloaded” — они надёжнее самописных решений. Nginx rate-limit работает на уровне сервера и эффективнее PHP-проверок.