Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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