Стандартный вход в 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.