Вы в основном есть несколько вариантов:
1) создать один уникальный идентификатор, который, казалось бы, случайные и хранить его в базу данных, с которой имя пользователя соответствует
2) Создание случайного пароля и включают в себя идентификатор пользователя и пароль в ссылке и сохранить пароль в базе данных
3) Используйте функцию одностороннего хеширования (md5, sah1 и т. д.) и секретный идентификатор для шифрования идентификатора пользователя. Вам не нужно хранить зашифрованный идентификатор пользователя в своей базе данных.
Вариант 1 затруднен, потому что вам нужно беспокоиться о проверке базы данных, чтобы узнать, существует ли ключ. Однако, хорошо, что URL-адрес не содержит имя пользователя, которое активируется.
Если вы уже собираетесь использовать какую-либо базу данных для хранения информации о пользователе (возможно, минимум пароля) в будущем, вы можете пойти с опцией 2. Для добавления еще одного столбца вашей базы данных. При отправке электронной почты сохраните имя пользователя и что-то вроде $ key = sha1 (rand (1, 99999). $ Username) в другом столбце для строки, содержащей имя пользователя. Тогда ваша ссылка выглядит так: http://you.com/activation.php?user= $ username & key = $ key. В activ.php вы проверяете, соответствует ли ключ значению, хранящемуся в базе данных.
Если вы хотите использовать меньше места для хранения в своей базе данных, вариант 3 будет работать. В качестве секретного идентификатора вы можете использовать что-то вроде $ key = sha1 ($ mysecret. $ Username). Используйте что-то странное, что вы знаете только как $ mysecret, например «aaafj_my_secret_adfaf». Используйте тот же тип URL-адреса, что и в варианте 2.Однако, поскольку вы можете генерировать $ key, основанный только на $ username, вам не нужно его хранить. Поэтому, когда вы обрабатываете в activ.php, просто проверьте, есть ли sha1 ($ mysecret. $ _GET [имя пользователя]) == $ _GET [ключ]. Если это так, вы знаете, что у вас есть правильный пользователь. Теоретически, с достаточной регистрацией, кто-то может определить ваше значение для $ mysecret и сгенерировать ключи активации. Тем не менее, вы наверняка заметили бы миллиарды или более регистраций, которые потребуются, прежде чем они смогут начать вычислять, что это такое. Количество требуемых активаций зависит от размера ключа функции хэширования. Используйте sha1 (160 бит) против md5 (128 бит), чтобы усложнить значение $ mysecret.
Отсутствие вероятности столкновения - вы также добавляете идентификатор пользователя в URL-адрес и проверяете, совпадают ли они. – Eli
@Eli, есть шанс, так как некоторые коллекции символов делают хэш с той же строкой хэша. Хотя вероятность довольно незначительная (но все же там). – alex
Эх, я не поклонник раскрытия информации первичного ключа для пользователя. Но это хорошая идея, Эли. поэтому key = $ generatedKey & id = $ uid –