2011-11-01 59 views
2

我正在使用忘记密码功能。忘了密码 - 我应该添加什么字段?

用户在忘记的密码页面输入他们的电子邮件地址,然后通过电子邮件发送哈希令牌链接。

令牌将是这个样子:

http://www.domain.com/account/resetpassword/4u240238402348239048092384908239080 

如果该链接,用户点击,然后它将搜索从用户users表散列令牌。如果找到,则显示文本字段以更改密码。

我将使用hash("sha256",...)函数来生成哈希。

应该如何将散列存储在users表中?

是否需要添加“reset_hash”和“reset_date”等字段?

+0

我也照顾用户不能使用注入或其他方法来欺骗哈希。 – cutrightjm

回答

4

是的,您应该添加两列:一个用于复位散列,另一个用于发出复位时的时间戳。后者应该用于确保密码在一定的时间范围内复位。

一旦密码重置发生,散列和/或时间也应该被移除,以防止将来重置使用相同的散列。

+0

当密码更改时,重置散列值和时间戳的值应该是多少?为空/空白我猜? –

+1

@ user791022:是的,要么都行。只要确保用户不能访问'http:// www.domain.com/account/resetpassword /',并对散列值为空和空值的用户发出密码重置。 –

1

是的,将这些字段存储在用户表中是一个好主意。您可以检查散列是否有效,并阻止将reset_date设置为实际的日期时间。可能是存储expire_date字段也是个好主意。

1

将散列存储为varchar(256),您可能需要一个请求日期,我会在收到请求时使用存储time()的int字段,以便您可以简单地执行time() - {dbtime }如果它超过了某个值,那么请求已超时。

编辑:如上所述,当请求已完成时,应将这两个字段都设置为NULL。

1

你想做正确的事情,但我会建议创建一个单独的表,这样的一次性行动。对我来说,似乎用户表并不是存储此信息的正确位置。

如果您创建了一个单独的表格,您可以稍后添加其他类型的操作,例如电子邮件确认等,并添加像截止日期之类的字段。如果执行该操作,则可以简单地从表中删除条目。