2012-10-06 65 views
0

如果我通过链接到密码重置页面发送电子邮件到用户的电子邮件地址,如何验证链接?我应该在数据库中存储一些随机生成的密钥,然后添加到链接字符串中? www.mydomain.com/passwordreset.html?key=abcd1234zz235然后根据数据库中存储的密钥检查此密钥?使用PHP发送密码重置电子邮件

如果这确实是正确的方法,我应该创建一些单独的表来存储这些密钥及其相应的电子邮件吗?如果答案是肯定的,那么我应该在用户重置密码后删除这些密钥以节省数据库空间吗?

预先感谢您!

+0

我没有在下面的任何答案中看到的东西是,你应该**不**以数据库中的纯文本存储访问密钥。它应该与用户的实际密码具有完全相同的安全性,因为它基本上是一个密码,这意味着您需要使用安全散列函数(例如bcrypt)对其进行散列。然后,您必须将用户ID和访问密钥一起发送给用户,并将ID和散列访问密钥存储在数据库中。 – Mike

回答

1

这是处理它的一个非常典型的方式。我通常会在我的user表中添加一个PasswordResetKey字段。

+0

以及您如何处理电子邮件地址甚至未使用xyz服务注册的密码重置请求? – Apollo

+0

@Derek你是什么意思?我不认为你的问题很清楚。 – Mahn

+0

如果用户决定重置地址adfjal; sfsadfasjfkl; safj; lkjsfl; ksajf; @ gmail.com的密码,则很可能该地址不存在。如果没有人拥有该地址,并且此电子邮件地址与我的服务的帐户没有关联,那么我应该如何处理此问题。 – Apollo

0

是的,这将工作。就我个人而言,我喜欢将密钥作为基于其用户数据的编码字符串,然后我可以解码。例如,我可以采用字符串userid|password_hash|emailaddress,对其进行编码并发送。然后,在接收它时,我可以将其解码并分解出来。用户ID用于搜索数据库,然后验证password_hash和电子邮件,如果全部检出,则可以继续。

也就是说,您的解决方案可能更好,因为这意味着您知道是否实际要求重置。最重要的是,它很难猜测。

+2

这是可怕的建议。如果您在链接中包含这类敏感信息,*和*允许任何人关注密码重置是否被请求,那么您已经为自己编写了一个巨大的安全问题。您正在发送足够的信息(未加密,请注意您),以便有人接管该帐户。 – tdammers

+0

以及如何处理电子邮件地址甚至没有用xyz服务注册过的密码重置请求? – Apollo

+0

我特意说我编码它。 –

0

看看this link,这可能会对你有所帮助。 基本上你必须创建一个密码重置请求表,并生成一个密钥来识别用户和重置请求本身。

1

我应该创建一些单独的表来存储这些密钥及其相应的电子邮件吗?

是的,我会那样做。

如果答案是肯定的,那么我应该在用户重置密码后删除这些密钥以节省数据库空间吗?

不是因为空间,而是因为交易已完成。

这里不能节省空间。因为您应该在审核日志中保留密码更改事件的日志条目。

+0

所以我不应该删除记录?我是否应该让每个密钥 - 电子邮件对在一段时间后超时,但保留记录?换句话说,在我的激活页面中,说www.mydomain.com/resetPassword.html我得到当前时间,并且只有在密钥 - 电子邮件对的创建日期为x小时前的情况下才验证重置? – Apollo

+0

@Derek我只是储存活动密钥,一旦使用它,将它从桌面移动到您的日志,无论您存储在哪里。 – Mahn

+0

@Mahn好吧,这是有道理的。最后,通过电子邮件发送用户的电子邮件是安全的。所以http://domain.com/[email protected]&key=dakjf;lsdfjv111adf24'ksaf,这样我就可以引用电子邮件来存储在数据库中的信息,在reset.php – Apollo