Двойная авторизация в WordPress: реализация без плагинов

В современных условиях безопасности важно обеспечить дополнительный уровень защиты для административной панели 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-сайта с минимальными ресурсами и без дополнительных зависимостей. Мы рассмотрели ключевые шаги реализации: перехват аутентификации, генерацию и отправку кода, проверку второго шага с авторизацией пользователя. Этот пример можно адаптировать под любые нужды и расширять под более сложные сценарии.

Как автоматизировать удаление спама в комментариях WordPress
20.12.2025
Как избежать конфликтов между плагинами WordPress: практические решения
05.12.2025
Как создать отслеживание пользовательских действий в WordPress с помощью AJAX и REST API
10.01.2026
Как сделать удалённую загрузку файлов в WordPress через AJAX с примерами
04.01.2026
Как удалить неиспользуемые типы записей в WordPress
29.12.2025