Вопрос или проблема
В настоящее время WordPress по умолчанию возвращает 200 как при неудачной, так и при успешной попытке входа. Современный стандарт, используемый всеми фреймворками веб-приложений, – возвращать 401 (или 403) при неудачных попытках входа.
Это позволяет сторонним инструментам (таким как WAF, fail2ban и др.) обнаруживать попытки брутфорса и блокировать их вне WordPress.
Я не могу найти, где я могу внести это изменение, или есть ли плагин, предоставляющий такую функциональность.
Да, я хорошо осведомлён о плагинах, которые пытаются предоставить “блокировку брутфорса” изнутри WordPress. Но, помимо того, что они сами являются проблемой, они подвержены блокировке изнутри установки WordPress. Защита размещена на неправильном уровне. Вместо того, чтобы быть защитой на уровне периметра, все эти запросы попадают на саму установку WordPress. Так что нет, это не лучший вариант для меня.
Спасибо за помощь!
WordPress обрабатывает неудачные входы двумя способами:
-
Если введены неправильные учетные данные, и имя пользователя и пароль имеют значение, это действие может быть перехвачено wp_login_failed.
-
Если одно из полей (или оба) пустые, WordPress генерирует объект ошибки как первый параметр в фильтре аутентификации; он не открывает событие и wp_login_failed захватывает эту причину/событие. Таким образом, что мы сделали здесь,
см. комментарии в коде:
add_filter( 'authenticate', function( $user, $username, $password ) {
// принудительное захватывание неудачного входа, чтобы принудительно открыть действие wp_login_failed,
// чтобы это событие могло быть перехвачено
if ( empty( $username ) || empty( $password ) ) {
do_action( 'wp_login_failed', $user );
}
return $user;
} );
// для обработки даже вы можете обработать ошибку так
add_action( 'wp_login_failed', function( $username ) {
if ( is_wp_error( $username ) ) {
// вы возвращаете 401 с помощью wp функции, это действие происходит до отправки заголовков.
$wp_query->set_401();
status_header( 401 );
nocache_headers();
}
} );
мой ответ является комбинацией: Перенаправление пользователя с использованием хуков действия ‘wp_login_failed’, если ошибка – ’empty_username’ или ’empty_password’ и Как принудительно вызвать 404 в WordPress
обновление: Я написал супер простой плагин для этого WP-401-On-Failed-Login. Он использует некоторые хуки аутентификации wp и set_header() перед отправкой контента.
Если у вас есть доступ к серверу, на котором работает ваш сайт, вы можете использовать modsecurity для возврата 401 с веб-сервера (вместо через PHP).
Вот туториал, который я написал некоторое время назад о блокировке IP-адресов и возврате 401 через modsecurity:
Ядро WordPress (и другие) не согласны с тем, что 401 (и 403) являются правильным “современным стандартом” и что “все фреймворки веб-приложений” используют 401 (или 403) для неудачных входов.
См. тикет ядра WordPress Trac #25446, чтобы понять, почему неудачные входы возвращают HTTP 200 и почему это не было изменено на 401 (или 403).
Вы можете решить первоначальную проблему, настроив fail2ban и аналогичные инструменты для фильтрации HTTP POST запросов к wp-login, которые возвращают HTTP СТАТУС КОД 200. Успешно отправленные входы получают 301 редирект.
Ответ или решение
Ответ на вопрос: Как вернуть код 401 для неудачных попыток входа в админку WordPress
По умолчанию, WordPress возвращает код ответа 200 как для успешных, так и для неудачных попыток входа на сайт. Это затрудняет работу систем защиты, таких как WAF или fail2ban. Многие разработчики в сфере безопасности считают правильным возвращать код 401 (или 403) при неудачных попытках аутентификации для лучшей обработки и защиты от брутфорс-атак. Ниже описан метод, который позволит реализовать данную функциональность.
1. Использование хуков WordPress
Вы можете использовать хуки authenticate
и wp_login_failed
для установки кода состояния 401 при неудачных попытках входа. Вот пример кода, который вам нужно добавить в файл вашей темы (обычно это functions.php
):
add_filter( 'authenticate', function( $user, $username, $password ) {
// Принудительно вызвать событие wp_login_failed для неудачной аутентификации
if ( empty( $username ) || empty( $password ) ) {
do_action( 'wp_login_failed', $username );
}
return $user;
} );
add_action( 'wp_login_failed', function( $username ) {
// Убедимся, что выдается код 401 при неудачной попытке входа
if ( is_wp_error( $username ) ) {
global $wp_query; // глобальная переменная для доступа к wp_query
$wp_query->set_401();
status_header( 401 );
nocache_headers(); // Убираем кеширование для этого заголовка
exit; // Выход из скрипта, чтобы предотвратить дальнейшую обработку
}
} );
Этот код делает следующее:
- Если предоставленный логин или пароль пустые, то вызывается действие
wp_login_failed
. - Затем, при вызове этого действия, устанавливается код 401, что сигнализирует о неудачной попытке входа.
2. Создание плагина
Если вы предпочитаете использовать плагин, вы можете создать простой плагин, который будет включать данный функционал. Вы можете использовать приведенный ниже шаблон:
<?php
/*
Plugin Name: WP 401 On Failed Login
Description: Возвращает код 401 для неудачных попыток входа в админку WordPress.
Version: 1.0
Author: Ваше имя
*/
add_filter( 'authenticate', function( $user, $username, $password ) {
if ( empty( $username ) || empty( $password ) ) {
do_action( 'wp_login_failed', $username );
}
return $user;
} );
add_action( 'wp_login_failed', function( $username ) {
global $wp_query;
$wp_query->set_401();
status_header( 401 );
nocache_headers();
exit;
} );
Сохраните этот файл как wp-401-on-failed-login.php
в папке с вашими плагинами и активируйте его через админку WordPress.
3. Использование средств защиты на уровне сервера
Если у вас есть доступ к серверу, вы также можете настроить mod_security
(или аналогичные средства) на уровне веб-сервера, чтобы возвращать код 401 для неудачных попыток входа. Вот ссылка на руководство по этому вопросу: Как блокировать брутфорс-логи через mod_security.
4. Создание правил Fail2ban
Если вы не можете изменить код WordPress или серверные конфигурации, вы также можете настроить fail2ban
для отслеживания запросов к wp-login.php
, которые возвращают код 200. Это позволит блокировать IP-адреса, осуществляющие неудачные попытки входа.
Заключение
Хотя изменение кода WordPress для возврата 401 может быть спорным вопросом, представленный метод даст вам возможность лучше контролировать неудачные попытки входа, улучшая общую безопасность вашего сайта.