2009-05-18 2 views
19

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

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

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

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

ответ

24

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

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

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

+5

Отсутствие вероятности столкновения - вы также добавляете идентификатор пользователя в URL-адрес и проверяете, совпадают ли они. – Eli

+0

@Eli, есть шанс, так как некоторые коллекции символов делают хэш с той же строкой хэша. Хотя вероятность довольно незначительная (но все же там). – alex

+2

Эх, я не поклонник раскрытия информации первичного ключа для пользователя. Но это хорошая идея, Эли. поэтому key = $ generatedKey & id = $ uid –

0

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

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

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

1

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

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

+1

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

+2

Хеш-функции не добавляют никакой энтропии, поэтому в этом случае они не будут делать коллизии более или менее вероятными. Они просто * выглядят более случайными для нас людьми. – Eli

7

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

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.

+1

Очень хорошее резюме опций и их плюсы и минусы! Я бы добавил, что независимо от того, какой вариант вы выберете, есть некоторые «инварианты», которые верны для всех из них. Например: 1. Ссылка активации должна быть уникальной в целом, потому что, если это не так, вы не можете сказать, какой пользователь активировать. 2. Вы должны сохранить как минимум адрес электронной почты в своей БД, и он должен быть уникальным. В этом представлении аргумент con первого варианта не так много, потому что вы все равно проверите уникальность (по крайней мере, на адрес электронной почты). – SasQ

0
$code = md5($_POST['username'] . microtime()); 
Смежные вопросы