Защита wp-login: ограничение попыток входа и rate-limit
Надёжная защита wp-login.php через ограничение попыток входа и rate-limit через nginx или WordPress hooks.
Как использовать
- Скопируйте нужный фрагмент кода.
- Вставьте в свой проект и при необходимости измените под задачу.
- Проверьте зависимости и окружение (версии, переменные).
Защита от брутфорса через ограничение попыток входа и 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-проверок.