Как сгенерировать защищенную строку активации в php?

StackOverflow https://stackoverflow.com/questions/876139

Вопрос

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

www.domain.com/activate.php?key =$Сгенерированный ключ

Как вы генерируете ключ?используя sha1 ($ email)??

После генерации ключа я сохраняю его в базе данных, чтобы, когда пользователь нажимает на ссылку, я мог проверить его с помощью базы данных??Я новичок в этом, пожалуйста, посоветуйте..Мне нужен скрипт подтверждения по электронной почте..

Это было полезно?

Решение

Лично я просто использую комбинацию таких вещей, как:

$generatedKey = sha1(mt_rand(10000,99999).time().$email);

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

Другие советы

В принципе, у вас есть несколько вариантов:

1) Создайте один уникальный идентификатор, который кажется случайным, и сохраните его в своей базе данных, с именем пользователя, которому он соответствует

2) Сгенерируйте случайный пароль и включите идентификатор пользователя и пароль в ссылку и сохраните пароль в базе данных

3) Используйте одностороннюю функцию хеширования (md5, sah1 и т.д.) и секретный идентификатор для шифрования идентификатора пользователя.Вам не обязательно хранить зашифрованный идентификатор пользователя в вашей базе данных.

Вариант 1 сложен, потому что вам приходится беспокоиться о проверке базы данных, чтобы убедиться, что ключ уже существует.Однако приятно, что URL-адрес не содержит активируемого имени пользователя.

Если вы уже собираетесь использовать какую-то базу данных для хранения информации о пользователе (возможно, как минимум пароль) в будущем, вы могли бы выбрать вариант 2.Добавление другого столбца в вашу базу данных не займет много времени.При отправке электронного письма сохраните имя пользователя и что-то вроде $key = sha1(rand(1, 99999) .$username) в другом столбце для строки, содержащей имя пользователя.Тогда пусть ваша ссылка будет выглядеть следующим образом: http://you.com/activation.php?user =$username&key=$ключ.В activation.php вы проверяете, равен ли ключ значению, хранящемуся в базе данных.

Если вы хотите использовать меньше места для хранения в вашей базе данных, подойдет вариант 3.Вы можете использовать что - то вроде $key = sha1($mysecret .$username) в качестве секретного идентификатора.Используйте что-то странное, что известно только вам как $mysecret, например 'aaafj_my_secret_adfaf'.Используйте тот же тип URL, что и в варианте 2.Однако, поскольку вы можете сгенерировать $key только на основе $username, вам не нужно его хранить.Поэтому, когда вы выполняете обработку в activation.php, просто проверьте, является ли sha1($mysecret .$_GET[имя пользователя]) == $_GET[ключ].Если это так, вы знаете, что у вас есть правильный пользователь.Теоретически, при достаточном количестве регистраций кто-то мог бы вычислить вашу стоимость за $ mysecret и также сгенерировать ключи активации.Однако вы наверняка заметили бы миллиарды или более регистраций, которые потребовались бы, прежде чем они смогли бы начать вычислять, что это такое.Количество требуемых активаций зависит от размера ключа функции хеширования.Используйте sha1 (160 бит) против md5 (128 бит), чтобы было сложнее угадать ваше значение $ mysecret.

$guid=md5(uniqid(mt_rand(), true));

Если вы сохраняете строку активации в базе данных и проверяете ее позже, вам вообще не нужен хэш!

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

Этого должно хватить, однако вы можете улучшить его, добавив немного соли, например:

$key = sha1($email . 'doYouLikeSauce');

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

$code = md5($_POST['username'] . microtime()); 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top