我正在创建一个涉及用户注册的PHP网站,想知道“电子邮件确认”代码的最佳实践。
新用户必须确认他们的电子邮件地址 - 我通过生成一个代码并将其发送到用户的电子邮件中来完成这个过程,用户可以使用该代码激活他的账户。我没有将该代码存储在数据库中,而是使用了一个方便的小技巧:该代码是以下操作的结果:
md5("xxxxxxxxx".$username."xxxxxxxxxxx".$timestamp."xxxxxxxxx");
$timestamp指的是用户创建时间。总体而言,我对此感到相当满意,但是后来我开始想,这样安全吗?还有碰撞的可能性吗?我还需要为密码重置等生成代码。如果我使用类似的方法,碰撞可能会导致一个用户无意中重置另一个用户的密码。那可不好。
那么你该如何做呢?我的想法是创建一个格式如下的表:
codePK (int, a-I), userID (int), type (int), code (varchar 32), date (timestamp)
'type'的值可以是1、2或3,分别代表“激活”、“更改电子邮件”或“重置密码”。这是一个好的方法吗?您有更好的方法吗?
使用类似上述方法,我是否可以在不使用cron作业的情况下自动删除两天前的任何内容?我的主机(nearlyfreespeech.net)不支持它们。如果可能的话,我希望避免在外部主机上有一个wget脚本来删除东西,因为那太混乱了=P。
谢谢!
Mala
更新:
澄清一下:我意识到完成此任务的唯一安全可靠的方法是使用数据库,这也是原始函数试图避免使用的。我的问题是关于表(或表格)应该如何结构化。有人建议我放弃codePK,只使用code作为PK。简而言之,我的问题是:您是这样做的吗?