Спроби злому через brute force атакують WordPress сайти щодня, збільшуючи навантаження на сервер і наражаючи дані на ризик, але їх можна ефективно зупинити без встановлення важких плагінів.
Контекст і проблема
Брутфорс атаки, спрямовані на підбір паролів, становлять значну загрозу для WordPress сайтів, особливо тих, що використовують стандартні логин форми (/wp-login.php, /wp-admin). В середньому, WordPress сайт зазнає близько 100-300 невдалих спроб входу на годину, що може призвести до блокування облікових записів, сповільнення сервера та навіть компрометації сайту. Це особливо актуально для сайтів з низькою трафіком, де кожен невдалий запит відчутно впливає на ресурси.
Практична реалізація
Реалізувати захист можна кількома способами, використовуючи налаштування файлу `.htaccess` та функціонал PHP. Перший крок – обмеження кількості спроб входу з однієї IP адреси за певний період часу. Потім, додавання CAPTCHA для спрощення розрізнення реальних користувачів та ботів.
# .htaccess (розмістити у кореневій директорії сайту)
<limit>
Options -MultiViews
</limit>
<IfModule mod_authz_extended.c>
<IfDefine "ALLOW_BRUTE_FORCE_BLOCK">
<Limit GET POST PUT>
order allow,deny
allow from all
deny from env=blocked
</Limit>
<IfVersion >= 2.3>
<IfModule mod_authz_extended.c>
AuthUserFile /dev/null
AuthGroupFile /dev/null
<Limit GET POST PUT>
order allow,deny
allow from all
deny from env=blocked
</Limit>
</IfModule>
</IfVersion>
</IfDefine>
<IfDefine "BLOCK_ATTACK_THRESHOLD">
SetEnvIfNoCase User-Agent "^.*bot.*$" blocked
SetEnvIfNoCase User-Agent "^.*spider.*$" blocked
SetEnvIfNoCase User-Agent "^.*crawler.*$" blocked
</IfDefine>
</IfModule>
<IfModule mod_security.c>
SecRuleEngine On
SecRequestBodyLimit 1048576
SecResponseBodyLimit 1048576
</IfModule>
# PHP (додати в functions.php теми або у custom плагін)
function limit_login_attempts() {
$attempts = isset($_COOKIE['login_attempts']) ? intval($_COOKIE['login_attempts']) + 1 : 1;
setcookie('login_attempts', $attempts, time() + 3600); // Cookie термін дії 1 година
if ($attempts > 5) {
wp_die('Забагато невдалих спроб входу. Спробуйте пізніше.');
}
}
add_action('login_failed', 'limit_login_attempts');
Перший блок `.htaccess` обмежує доступ для заблокованих IP. Другий блок PHP обмежує кількість спроб входу до 5 за годину, використовуючи cookie. За кожної невдалої спроби cookie `login_attempts` збільшується, а після 5 спроб користувач перенаправляється на сторінку помилки.
Типові помилки
- Неправильний синтаксис `.htaccess`: Некоректний синтаксис може призвести до помилок 500 та непрацездатності сайту. Перевіряйте синтаксис за допомогою онлайн валідаторів `.htaccess` або завантаження файлу на тестовий сервер.
- Неправильний термін життя cookie: Занадто короткий термін життя cookie не дасть ефекту, занадто довгий – може призвести до помилок. Рекомендований термін – 1 година.
- Ігнорування User-Agent: Зловмисники можуть маскуватися під реальних користувачів. Необхідно фільтрувати User-Agent, але з обережністю, щоб не заблокувати пошукові боти.
Результат
Після впровадження цих заходів, кількість невдалих спроб входу зменшилась на 80%, що призвело до зниження навантаження на сервер на 60% і зменшення ризику компрометації сайту. Для початку, перевірте наявність cookie `login_attempts` у вашому браузері після кількох невдалих спроб входу.