Как сделать OTP-авторизацию для wp-login.php в WordPress

Одноразовые пароли (OTP) — один из самых эффективных способов усилить безопасность входа в WordPress. В этой статье рассмотрим, как добавить OTP-авторизацию на стандартную страницу входа wp-login.php с помощью плагинов и собственного кода. Вы узнаете, как организовать отправку кода на email или SMS, как проверить код при входе и как интегрировать этот дополнительный уровень защиты без ущерба для удобства пользователей.

Зачем добавлять OTP на страницу входа WordPress

Стандартная авторизация по логину и паролю часто уязвима к фишингу, брутфорс-атакам и утечкам данных. OTP помогает решить эти проблемы, так как для входа нужен не только пароль, но и временный код, который меняется при каждой попытке входа.

В отличие от многофакторной аутентификации через приложения типа Google Authenticator, OTP можно сделать максимально простым для пользователя — например, отправлять код на email или SMS. Это удобно, если пользователи не хотят устанавливать дополнительные приложения.

Реализация OTP повысит защиту сайта от несанкционированного доступа, особенно если пароль пользователя скомпрометирован.

Использование плагина WP OTP Login для реализации одноразового пароля

Один из удобных бесплатных плагинов для добавления OTP — WP OTP Login. Он позволяет настроить отправку OTP на email и SMS (через интеграцию с внешними сервисами).

Как установить и настроить WP OTP Login

  1. Перейдите в админку WordPress, раздел «Плагины» → «Добавить новый».
  2. В поиске введите «WP OTP Login» и установите плагин.
  3. Активируйте плагин.
  4. В настройках плагина укажите, куда отправлять OTP: email или номер телефона.
  5. При необходимости подключите SMS-сервис (Twilio, SMS.ru и др.).
  6. Сохраните настройки и протестируйте работу OTP при входе.

Плагин автоматически добавит форму ввода одноразового кода после успешной проверки логина и пароля, что значительно повысит безопасность.

Реализация OTP на wp-login.php через собственный код

Если вы хотите гибко управлять процессом и избежать зависимости от сторонних плагинов, можно добавить OTP самостоятельно. Ниже пример базовой реализации отправки OTP на email и проверки кода при входе.

Шаг 1. Генерация и отправка OTP

function wplogin_generate_send_otp($user_login) {
    $user = get_user_by('login', $user_login);
    if (!$user) return;

    $otp = wp_rand(100000, 999999);
    update_user_meta($user->ID, '_wplogin_otp', $otp);
    update_user_meta($user->ID, '_wplogin_otp_expiry', time() + 300); // срок действия 5 минут

    $to = $user->user_email;
    $subject = 'Ваш одноразовый пароль (OTP) для входа на сайт';
    $message = 'Ваш код для входа: ' . $otp . '. Он действителен 5 минут.';
    wp_mail($to, $subject, $message);
}

Эту функцию нужно вызывать после проверки логина и пароля, но до полного входа в систему.

Шаг 2. Добавление поля ввода OTP на страницу входа

function wplogin_add_otp_field() {
    if (isset($_POST['log']) && !empty($_POST['log'])) {
        echo '<p><label for="otp_code">Одноразовый пароль (OTP)</label><br/><input type="text" name="otp_code" id="otp_code" class="input" value="" size="20" /></p>';
    }
}
add_action('login_form', 'wplogin_add_otp_field');

Шаг 3. Проверка OTP перед входом

function wplogin_check_otp($user, $username, $password) {
    if (isset($_POST['log']) && isset($_POST['pwd']) && isset($_POST['otp_code'])) {
        $otp_input = sanitize_text_field($_POST['otp_code']);
        $user = get_user_by('login', $username);
        if (!$user) {
            return $user;
        }
        $otp_saved = get_user_meta($user->ID, '_wplogin_otp', true);
        $otp_expiry = get_user_meta($user->ID, '_wplogin_otp_expiry', true);

        if (!$otp_saved || time() > $otp_expiry) {
            return new WP_Error('otp_expired', '<strong>Ошибка:</strong> Одноразовый пароль истек. Запросите новый.');
        }

        if ($otp_input !== $otp_saved) {
            return new WP_Error('otp_invalid', '<strong>Ошибка:</strong> Неверный одноразовый пароль.');
        }

        // Очистка OTP после успешной проверки
        delete_user_meta($user->ID, '_wplogin_otp');
        delete_user_meta($user->ID, '_wplogin_otp_expiry');
    }
    return $user;
}
add_filter('authenticate', 'wplogin_check_otp', 30, 3);

Шаг 4. Инициация отправки OTP после проверки пароля

function wplogin_send_otp_after_password_check($user, $username, $password) {
    if (is_wp_error($user)) {
        return $user;
    }
    if ($user && isset($_POST['log']) && isset($_POST['pwd'])) {
        // Отправляем OTP только один раз, если еще не отправлен
        $otp = get_user_meta($user->ID, '_wplogin_otp', true);
        $otp_expiry = get_user_meta($user->ID, '_wplogin_otp_expiry', true);
        if (!$otp || time() > $otp_expiry) {
            wplogin_generate_send_otp($username);
        }

        // Блокируем вход до ввода OTP
        return new WP_Error('otp_required', '<strong>Требуется OTP</strong>: пожалуйста, введите одноразовый пароль, отправленный на ваш email.');
    }
    return $user;
}
add_filter('authenticate', 'wplogin_send_otp_after_password_check', 20, 3);

Дополнительные рекомендации и улучшения

1. Для повышения удобства можно добавить кнопку «Отправить повторно OTP» на форму входа, чтобы пользователь мог запросить новый код при необходимости.

2. Если вы хотите использовать SMS, интегрируйте API соответствующего сервиса (например, Twilio или SMS.ru) в функцию отправки wplogin_generate_send_otp.

3. Для логирования попыток входа и OTP можно использовать плагин WP OTP Login с расширенными функциями.

4. Не забудьте защитить поля формы от CSRF и XSS, а также использовать HTTPS на сайте для безопасности передачи данных.

Вывод

Добавление OTP на страницу входа wp-login.php — эффективный способ повысить безопасность WordPress от взлома и несанкционированного доступа. Можно использовать готовые плагины, например, WP OTP Login, либо реализовать функционал самостоятельно с помощью приведенного кода. Такой подход позволит быстро внедрить дополнительный уровень защиты, не усложняя процесс входа для пользователей.

Как отключить вход в WordPress для определённых ролей пользователей
16.03.2026
Как исправить проблему с циклическим редиректом при входе в WooCommerce
12.06.2026
Как автоматизировать сбор логов входа в WordPress для анализа и безопасности
11.04.2026
Как отключить кеширование страницы входа в WordPress
15.02.2026
Как установить ограничения на число попыток входа в WordPress без сторонних плагинов
28.01.2026

wp-login.php - это страница входа в системе управления вордпресс. Если Вы хотите изменить внешний вид страницы входа - читайте здесь. Если вам нужно защитить админку - подробный мануал. Вы можете установить плагин Clearfy, в котором есть функция защиты админки и страницы входа.