Как изменить метод авторизации в WordPress на токены для повышения безопасности

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

Почему вход по токенам безопаснее классической формы входа

Авторизация по логину и паролю уязвима к различным типам атак: брутфорс, фишинг, перехват сессий и т.д. Токен — это уникальная строка, генерируемая сервером и действующая ограниченное время. Пользователь получает ссылку с токеном по email или через приложение, и может войти без ввода пароля.

Основные преимущества метода с токенами:

  • Отсутствие необходимости хранения и передачи пароля, что снижает риск компрометации.
  • Токен действителен только ограниченное время, после чего становится недействительным.
  • Токены можно аннулировать вручную или автоматически при подозрении на взлом.
  • Удобство для пользователей — не нужно помнить сложные пароли.

Как реализовать вход по токенам в WordPress: пошаговое руководство

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

1. Генерация токена и отправка ссылки на email

При запросе входа пользователь вводит email, мы проверяем наличие пользователя и создаём уникальный токен, сохраняем его в метаполе пользователя с временем истечения. Затем отправляем письмо с ссылкой.

function wplogin_generate_login_token($user_id) {
    $token = bin2hex(random_bytes(16));
    $expiry = time() + 900; // токен действует 15 минут
    update_user_meta($user_id, '_wplogin_token', $token);
    update_user_meta($user_id, '_wplogin_token_expiry', $expiry);
    return $token;
}

function wplogin_send_login_link($user_email) {
    $user = get_user_by('email', $user_email);
    if (!$user) {
        return false;
    }
    $token = wplogin_generate_login_token($user->ID);
    $login_url = add_query_arg([
        'wplogin_token' => $token,
        'user' => $user->ID
    ], site_url('/'));
    $subject = 'Ссылка для входа на сайт ' . get_bloginfo('name');
    $message = "Здравствуйте!\n\nДля входа на сайт используйте ссылку:\n" . $login_url . "\n\nСсылка действительна 15 минут.";
    wp_mail($user_email, $subject, $message);
    return true;
}

Данный код генерирует токен длиной 32 символа (16 байт в hex), сохраняет его и отправляет письмо с ссылкой.

2. Обработка входа по токену

Добавим проверку параметров wplogin_token и user в URL, и если токен верный и не истёк, авторизуем пользователя автоматически.

function wplogin_auto_login_by_token() {
    if (!isset($_GET['wplogin_token'], $_GET['user'])) {
        return;
    }
    $user_id = intval($_GET['user']);
    $token = sanitize_text_field($_GET['wplogin_token']);
    $saved_token = get_user_meta($user_id, '_wplogin_token', true);
    $expiry = get_user_meta($user_id, '_wplogin_token_expiry', true);
    if (!$saved_token || !$expiry) {
        return;
    }
    if ($token === $saved_token && time() < $expiry) {
        wp_set_auth_cookie($user_id);
        delete_user_meta($user_id, '_wplogin_token');
        delete_user_meta($user_id, '_wplogin_token_expiry');
        wp_safe_redirect(admin_url());
        exit;
    }
}
add_action('init', 'wplogin_auto_login_by_token');

Этот код проверит токен и, если всё верно, войдёт за пользователя и удалит токен, чтобы предотвратить повторное использование.

Интеграция с формой запроса входа

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

function wplogin_login_request_form() {
    if (isset($_POST['wplogin_email'])) {
        $email = sanitize_email($_POST['wplogin_email']);
        if (wplogin_send_login_link($email)) {
            echo '<p>Ссылка для входа отправлена на ваш email.</p>';
        } else {
            echo '<p>Пользователь с таким email не найден.</p>';
        }
    }
    echo '<form method="post">'
        . '<label>Введите ваш email:</label>'
        . '<input type="email" name="wplogin_email" required />'
        . '<button type="submit">Получить ссылку</button>'
        . '</form>';
}

Эту форму можно вывести на отдельной странице с помощью шорткода:

function wplogin_login_request_shortcode() {
    ob_start();
    wplogin_login_request_form();
    return ob_get_clean();
}
add_shortcode('wplogin_request_link', 'wplogin_login_request_shortcode');

Советы по дополнительной безопасности и улучшению UX

1. Ограничение числа запросов на генерацию токена

Чтобы предотвратить спам и атаки перебора, стоит ограничить частоту отправки ссылок одному пользователю или IP. Для этого можно сохранять временную метку последнего запроса и проверять её перед генерацией нового токена.

2. Защита ссылки с токеном

Токен — чувствительный параметр, поэтому стоит использовать HTTPS для передачи ссылки. Также можно добавить дополнительные параметры или использовать хэширование для усложнения подбора.

3. Интеграция с плагинами безопасности и кешированием

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

Пример готового плагина для входа по токенам

Вышеописанные функции можно объединить в один плагин. Такой подход позволяет легко расширять функциональность, например, добавить поддержку входа через Telegram или другие каналы, используя WPGPT для генерации уникальных ссылок.

Заключение

Метод входа по одноразовым токенам — отличный способ повысить безопасность и удобство авторизации на сайте WordPress. Он минимизирует риски взлома через брутфорс, избавляет пользователей от необходимости помнить пароли и может быть реализован самостоятельно с помощью нескольких функций.

Для более продвинутых решений и автоматизации советуем рассмотреть плагины из WPShop.ru, которые помогут интегрировать современные методы защиты и улучшить UX.

Как исправить ошибку 429 Too Many Requests при входе в WordPress
15.06.2026
Как отключить автоматический вход в WordPress после регистрации пользователя
30.03.2026
Как удалить блокировку входа после Limit Login Attempts в WordPress
03.06.2026
Как сделать OTP-авторизацию для wp-login.php в WordPress
15.04.2026
Как установить ограничения на число попыток входа в WordPress без сторонних плагинов
28.01.2026

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