Использование user_activation_key для других целей

28 окт. 2012 г., 10:11:16
Просмотры: 32.2K
Голосов: 6

Мне нужно знать, безопасно ли использовать user_activation_key (из WP_User) для других целей, например, для верификации email (функционал, который я бы создал для отправки подтверждения email перед активацией созданной учетной записи)?

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

http://www.example.com/verify/?key=SAMPLEACTIVATIONKEY4321

Как вы думаете, будет ли это безопасно?

0
Все ответы на вопрос 2
2

Думаете, это будет безопасно?

Возможно. Две проблемы.

Вам также нужно убедиться, что ключ нельзя угадать. Никаких последовательных чисел. Вы можете использовать что-то вроде wp_generate_password для получения псевдослучайных символов. Используйте случайную "соль" плюс email пользователя и время регистрации или uniqid, и у вас будет хороший шанс обеспечить уникальность (см. ниже) и создать неугадываемый ключ.

$user_email = some_function_to_get_user_email();
$salt = wp_generate_password(20); // 20-символьная "случайная" строка
$key = sha1($salt . $user_email . uniqid(time(), true));

Вам также нужно обеспечить уникальность ключа: не должно быть коллизий.

В базе данных нет ограничений на столбец user_activation_key, которые гарантируют уникальность, поэтому ваше приложение (например, WordPress и PHP-часть) должно это обеспечить. Другими словами, перед или после генерации ключа убедитесь, что он еще не существует в базе данных. Простой, непроверенный пример:

<?php
$key = some_function_that_generates_a_key();
$res = $wpdb->get_col($wpdb->prepare("SELECT EXISTS(SELECT 1 FROM {$wpdb->users} WHERE user_activation_key = %s)", $key));
if ($res) {
    // ключ существует, попробуйте снова!
} else {
    // всё в порядке.
}

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

27 янв. 2013 г. 06:57:57
Комментарии

Спасибо за этот замечательный ответ. (Я знаю, что ответ запоздал, ха-ха! Но он действительно полезный.)

mcometa mcometa
18 сент. 2013 г. 12:14:58

Или, если не хотите заморачиваться с коллизиями, просто передайте идентификатор пользователя в запросе на верификацию

Tofandel Tofandel
24 февр. 2019 г. 18:03:51
3

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

28 окт. 2012 г. 10:33:36
Комментарии

Привет @Ajay, я отредактировал свой вопрос, чтобы добавить более полные детали. Пожалуйста, проверь снова, так как я не понял, что ты имел в виду под "anyone use this".

mcometa mcometa
28 окт. 2012 г. 11:05:39

Я думаю, он имеет в виду, что нужно сделать ключ активации более специфичным для пользователя, которому он принадлежит. Это предотвратит использование методов brute force для получения доступа к чужому аккаунту.

Ollie Ollie
28 окт. 2012 г. 14:20:24

@Ollie Я убедился, что ключ активации отправляется на email-адрес пользователя, который пытается зарегистрироваться. Также ключ активации содержит хешированное значение имени пользователя, пароля и временной метки. Я правильно делаю? Вроде как новичок в этих вещах с Wordpress.

mcometa mcometa
28 окт. 2012 г. 15:33:29