【发布时间】:2025-12-08 01:25:01
【问题描述】:
我目前正在设计一个小型网站,我想实现“忘记密码?”特征。这是我的想法:
忘记密码的网页会有这个:
Email: (input box)
(button: "Make temp password")
点击“制作临时密码”按钮:
- 为 SQLi/XSS 清理电子邮件输入
- 检查电子邮件地址是否存在于数据库中
- 如果没有,告诉用户创建新帐户或检查电子邮件拼写
- 创建随机密码(即“xh5MvQe”)并将其放入数据库中的用户临时密码字段中。
- 如果已经存在则覆盖。不要触摸主密码。在接下来的 48 小时内,用户将能够使用两个密码登录。
- 获取当前 UTC 时间加上 48 小时,并将其放入数据库中用户的临时密码到期日期字段。如果已经存在则覆盖。
- 使用临时密码向用户发送电子邮件
我的数据库有用户表的这些字段:
(primary key) user id
name
nickname
(non null, unique) email
(non null) password (encrypted)
temporary password
temporary password expiration
一旦用户获得密码,他们就可以登录并更改他们的主密码。
问题是:这是实现此功能的安全方式吗?我主要关心的是通过电子邮件发送纯文本密码。我已经看到了另一种使用电子邮件哈希/时间戳/随机 id 作为 GET 参数生成链接的方法,但我看不出这有多安全。如果我错了,请纠正我。
【问题讨论】:
-
我同意这两种方法同样安全,并注意电子邮件中的链接是可点击的。
-
您列出的步骤很好。您无法控制用户如何管理他们的电子邮件地址,但增加一些安全性的好方法是在重置密码之前提出安全问题。如果一些用户也忘记了这一点,这可能是不明智的,所以这取决于你想要它的方式以及更有用的东西。
-
只是大声思考。但是,如果您担心通过电子邮件发送密码,那么使用 2 个恢复密码会不会太费力?您可以通过电子邮件发送一份,然后显示一份。这样您就知道电子邮件没有被截获,因为只有请求密码的用户才有第二个密码。几乎就像“我拥有的东西”+“我知道的东西”之类的东西。
标签: php forgot-password