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

Вам также может быть интересно:

Как автоматически разблокировать пользователей после блокировки в Limit Login Attempts
03.10.2026
Как закрыть старые отладочные логи WordPress через PHP и .htaccess
16.09.2026
Как создать свой плагин для изменения формы входа в WordPress
15.09.2026
Как исправить 404 в админке и на странице входа WordPress после смены Site URL
27.08.2026
Как добавить логируемые события входа в WordPress для безопасности и аналитики
29.09.2026
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше