Как создать безопасную строку активации в php? - PullRequest
19 голосов
/ 18 мая 2009

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

www.domain.com / activate.php? Ключ = $ generatedKey

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

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

Ответы [ 6 ]

25 голосов
/ 18 мая 2009

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

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

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

8 голосов
/ 18 мая 2009

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

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

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

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

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

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

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

1 голос
/ 18 мая 2009

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

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

1 голос
/ 18 мая 2009
$guid=md5(uniqid(mt_rand(), true));
0 голосов
/ 10 июня 2015
$code = md5($_POST['username'] . microtime()); 
0 голосов
/ 18 мая 2009

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

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

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

...