Как создать безопасную строку активации в php?

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

www.domain.com/activate.php?key=$generatedKey

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

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

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

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

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

У вас в основном есть несколько вариантов:

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.

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

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

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

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

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

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

 $code = md5($_POST['username'] . microtime());