19

用户订阅电子邮件到我的网站后。我的网站将生成一封电子邮件确认并发送给他们。在电子邮件内容中,我需要包含激活密钥,例如:

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

你如何生成密钥?使用 sha1($email)??

生成密钥后,我将其存储在数据库中,这样当用户单击链接时,我可以使用数据库对其进行验证?我是新手,请指教.. 我需要一个电子邮件确认脚本..

4

6 回答 6

26

就个人而言,我只是使用以下组合:

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

发生冲突的可能性很小,但我建议在发送之前先检查您的数据库(使用 UNIQUE 约束是一种简单的方法)。

于 2009-05-18T03:34:07.037 回答
8

你基本上有几个选择:

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'。使用与选项 2 中相同类型的 URL。但是,由于您可以仅根据 $username 生成 $key,因此您不需要存储它。因此,当您在activation.php 中进行处理时,只需检查是否 sha1($mysecret . $_GET[username]) == $_GET[key]。如果是这样,您就知道您拥有正确的用户。从理论上讲,只要注册足够多,有人就可以计算出您对 $mysecret 的价值并生成激活密钥。但是,您肯定会注意到在他们开始计算它之前需要进行数十亿或更多的注册。所需的激活次数取决于散列函数的密钥大小。使用 sha1(160 位)与 md5(128 位)更难猜测您的 $mysecret 值。

于 2009-05-18T04:34:21.087 回答
1
$guid=md5(uniqid(mt_rand(), true));
于 2009-05-18T03:34:36.880 回答
1

如果您将激活字符串存储在数据库中并稍后检查,则根本不需要哈希!

你只需要一个很长的随机字符串。你可以随心所欲地生成它,只要让它变长。事实上,理想情况下,它应该与电子邮件或用户名无关。

于 2009-05-18T03:54:18.450 回答
0

应该这样做,但是您可以通过添加一些盐来改进它,例如:

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

其他方法只是生成一个随机密码并通过电子邮件发送。

于 2009-05-18T03:34:50.783 回答
0
$code = md5($_POST['username'] . microtime()); 
于 2015-06-10T05:36:37.967 回答