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

时间:2015-01-16 19:03:19

标签: php bcrypt reset-password

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

程序将是......

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

1 个答案:

答案 0 :(得分:2)

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

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

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

所以假设你在邮件运输过程中可能没有加密的情况下做得很好(不是说你可以做很多事情 - 也许使用短信,但即使这样也没有加密,我也不确定哪一个更难截取),您可以强制执行的唯一安全措施是仅通过HTTPS提供代码输入页面/链接页面,以便位于用户计算机和服务器之间的攻击者无法拦截它一旦用户试图输入代码或链接。

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