PHP 使用代码而不是链接重置密码


PHP Reset Password with code instead of link

当用户想要更改密码时,通过电子邮件向用户发送随机生成的代码而不是链接有什么问题吗?

程序将是...

  1. 用户通过输入电子邮件地址触发密码重置
  2. 电子邮件在数据库中签为真正的用户
  3. 电子邮件使用随机生成的代码发送给该用户
  4. 相同的代码被加密并插入到数据库中的专用列中
  5. 用户输入通过电子邮件发送给他们的代码
  6. 根据存储的基于bcrypt密码进行检查
  7. (如果全部正确)允许用户输入新密码

无论是代码还是链接,在安全性方面确实没有区别。

链接

所做的只是自动输入代码并提交表单;链接的唯一缺点是一些(在我看来很糟糕)电子邮件提供商会自动向电子邮件中的所有链接发出GET请求,在这种情况下,您应该做的是您的链接应该指向一个页面,要求单击按钮以确认重置(在幕后发出第二个POST请求),以便"意外"GET不会触发重置。

在安全性方面,电子邮件不是最安全的媒介,因为一旦邮件离开您的电子邮件服务器,您将无法强制执行加密 - 如果碰巧中继该电子邮件的邮件服务器不支持加密,他们会将未加密的邮件传递到下一个服务器,等等。

因此,假设您对邮件在传输过程中可能未加密感到满意(并不是说您可以对此做很多事情 - 也许使用 SMS,但即使它是未加密的,我不确定哪一个更难拦截),您可以实施的唯一安全性是仅通过 HTTPS 提供代码输入页面/链接页面,以便位于用户机器和服务器之间的攻击者将无法拦截一旦用户尝试输入代码或链接。

一个好的用户体验解决方案是使您的代码入口页接受查询字符串参数以自动填写代码(如果提供)(如果缺少参数,则为用户提供一个空白表单供用户手动填写),并且您的电子邮件应同时包含 (HTTPS) 链接和代码,以防用户由于某种原因无法使用链接。