如何在php中生成安全的激活字符串?
用户订阅电子邮件到我的网站后。我的网站将生成一封确认电子邮件并发送给他们。在电子邮件内容中,我需要包括激活密钥,例如:
www.domain.com/activate.php?key=$generatedKey
如何生成密钥?使用 sha1($email)??
生成密钥后,我将其存储在数据库中,以便当用户单击链接时,我可以用数据库验证它??我是新手,请指教。我需要一个电子邮件确认脚本。
用户订阅电子邮件到我的网站后。我的网站将生成一封确认电子邮件并发送给他们。在电子邮件内容中,我需要包括激活密钥,例如:
www.domain.com/activate.php?key=$generatedKey
如何生成密钥?使用 sha1($email)??
生成密钥后,我将其存储在数据库中,以便当用户单击链接时,我可以用数据库验证它??我是新手,请指教。我需要一个电子邮件确认脚本。
就个人而言,我只是使用以下组合:
$generatedKey = sha1(mt_rand(10000,99999).time().$email);
冲突的可能性很小,但我建议在发送数据库之前先检查数据库(使用 UNIQUE 约束是一种简单的方法)。
你基本上有几个选择:
1)创建一个看似随机的唯一标识符,并将其存储在数据库中,该用户名与哪个用户名相对应
2)生成一个随机密码,并在链接中包含用户ID和密码,并将密码存储在数据库中
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”。使用与选项 2 中相同的 URL 类型。但是,由于您只能基于$username生成$key,因此不需要存储它。因此,当您在激活中处理时.php,只需检查sha1($mysecret . $_GET[用户名])== $_GET[key]。如果是这样,则表明您拥有正确的用户。从理论上讲,通过足够的注册,有人可以计算出您的$mysecret值,并生成激活密钥。但是,您肯定会注意到在他们开始计算它之前需要数十亿或更多的注册。所需的激活次数取决于哈希函数的密钥大小。使用 sha1(160 位)与 md5(128 位)使猜测$mysecret值变得更加困难。