В современных условиях безопасности важно обеспечить дополнительный уровень защиты для административной панели WordPress. Один из эффективных способов — реализовать двойную авторизацию (двухфакторную аутентификацию) без использования сторонних плагинов. В этой статье мы подробно рассмотрим, как добавить второй шаг проверки пользователя с помощью минимального набора кода, чтобы повысить безопасность вашего сайта на WordPress.
Что такое двойная авторизация и зачем она нужна в WordPress
Двойная авторизация — это дополнительный уровень проверки пользователя после ввода логина и пароля. Обычно она подразумевает введение одноразового кода, который генерируется отдельным приложением (например, Google Authenticator) или отправляется на телефон. Это значительно снижает риск взлома даже при компрометации пароля.
В WordPress по умолчанию такой механизм не предусмотрен, и многие сайты полагаются только на пароль. Использование плагинов — самый простой способ добавить 2FA, но они могут замедлять сайт и создавать дополнительные зависимости. Поэтому мы рассмотрим, как реализовать двойную авторизацию вручную.
Общая схема работы двойной авторизации без плагинов
Наша реализация будет следующей:
- После успешного ввода логина и пароля пользователь не сразу получает доступ, а перенаправляется на страницу ввода одноразового кода.
- Одноразовый код генерируется на сервере и сохраняется в сессии или базе данных.
- Пользователь вводит код, и если он совпадает, сессия авторизации завершается успешно.
- Если код неверный, доступ не предоставляется.
Для простоты мы рассмотрим реализацию с отправкой кода на email, но можно модифицировать под SMS или приложения-генераторы кодов.
Добавление второго шага авторизации: создание функции wpbest_custom_2fa_authenticate
Первый шаг — перехват стандартного процесса логина WordPress с целью внедрить проверку кода после ввода пароля. Для этого используем хук wp_authenticate_user, который позволяет изменить результат аутентификации.
function wpbest_custom_2fa_authenticate($user, $password) {
if (is_wp_error($user)) {
return $user; // если ошибка — возвращаем ее
}
// Проверяем, есть ли уже подтвержденный 2FA для этого пользователя
if (get_user_meta($user->ID, '_wpbest_2fa_passed', true)) {
// Сбросим мета, чтобы требовать повторную проверку при следующем входе
delete_user_meta($user->ID, '_wpbest_2fa_passed');
return $user; // разрешаем вход
}
// Генерируем код и сохраняем в мета пользователя
$code = wpbest_generate_2fa_code();
update_user_meta($user->ID, '_wpbest_2fa_code', $code);
// Отправляем код на email
wp_mail(
$user->user_email,
'Код двойной авторизации для вашего сайта',
'Ваш код: ' . $code
);
// Запоминаем ID пользователя для проверки кода
$_SESSION['wpbest_2fa_user_id'] = $user->ID;
// Возвращаем ошибку, чтобы остановить стандартный вход
return new WP_Error('wpbest_2fa_required', 'Требуется ввести код двойной авторизации');
}
add_filter('wp_authenticate_user', 'wpbest_custom_2fa_authenticate', 10, 2);
Данная функция перехватывает логин, генерирует код и отправляет его на email пользователя. При этом вход не завершается, а пользователю нужно ввести код.
Создание страницы для ввода кода и проверки
После того как мы «отклоняем» стандартный вход, нужно создать страницу, где пользователь сможет ввести код. Самый простой способ — создать кастомный шаблон страницы или добавить обработчик на существующую страницу входа.
Пример простого обработчика в functions.php:
function wpbest_2fa_check_code() {
if (isset($_POST['wpbest_2fa_code']) && isset($_SESSION['wpbest_2fa_user_id'])) {
$user_id = intval($_SESSION['wpbest_2fa_user_id']);
$code_stored = get_user_meta($user_id, '_wpbest_2fa_code', true);
$code_entered = sanitize_text_field($_POST['wpbest_2fa_code']);
if ($code_stored === $code_entered) {
// Отмечаем, что 2FA пройдена
update_user_meta($user_id, '_wpbest_2fa_passed', true);
// Удаляем код
delete_user_meta($user_id, '_wpbest_2fa_code');
// Авторизуем пользователя вручную
wp_set_current_user($user_id);
wp_set_auth_cookie($user_id);
unset($_SESSION['wpbest_2fa_user_id']);
wp_redirect(admin_url());
exit;
} else {
echo '<div style="color:red;">Неверный код двойной авторизации.</div>';
}
}
}
add_action('login_form', 'wpbest_2fa_check_code');
И добавим HTML-форму для ввода кода на странице входа. Для примера можно добавить в login_form хук:
function wpbest_2fa_form() {
if (isset($_SESSION['wpbest_2fa_user_id'])) {
echo '<form method="post" action="">';
echo '<p>Введите код, отправленный на ваш email:</p>';
echo '<input type="text" name="wpbest_2fa_code" required />';
echo '<input type="submit" value="Подтвердить" />';
echo '</form>';
exit; // чтобы не выводить стандартную форму входа
}
}
add_action('login_form', 'wpbest_2fa_form', 20);
Генерация одноразового кода: функция wpbest_generate_2fa_code
Для генерации кода используем простую функцию, создающую 6-значный числовой код:
function wpbest_generate_2fa_code() {
return wp_rand(100000, 999999);
}
Вы можете расширить эту функцию, например, генерируя коды с буквами или с ограничением по времени действия.
Улучшения и рекомендации
Реализация выше — базовая и подходит для небольших проектов. Для повышения надежности стоит учесть следующие моменты:
- Хранение кода с меткой времени и истечение срока действия (например, 5 минут).
- Использование более защищенного способа передачи кода — SMS или приложения-генераторы кода (TOTP).
- Логирование попыток ввода для предотвращения перебора.
- Использование сессий WordPress или собственного механизма сессий.
- Добавление возможности отключить 2FA для отдельных пользователей.
Для интеграции с современными плагинами можно посмотреть на Clearfy Pro, который частично оптимизирует безопасность и производительность WordPress.
Заключение
Добавление двойной авторизации без использования плагинов — отличный способ повысить безопасность WordPress-сайта с минимальными ресурсами и без дополнительных зависимостей. Мы рассмотрели ключевые шаги реализации: перехват аутентификации, генерацию и отправку кода, проверку второго шага с авторизацией пользователя. Этот пример можно адаптировать под любые нужды и расширять под более сложные сценарии.