我目前正在设计一个小型网站,我想实现“忘记密码?” 特征。这是我的想法:
忘记密码的网页会有这个:
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 参数生成链接的另一种方式,但我看不出这有多安全。如果我错了,请纠正我。