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

PHP用代码而不是链接重置密码,php,bcrypt,reset-password,Php,Bcrypt,Reset Password,当用户想要更改密码时,通过电子邮件向其发送随机生成的代码而不是链接是否有任何问题 程序是 用户通过输入电子邮件地址触发密码重置 在DB中检查电子邮件是否为真正用户 电子邮件以随机生成的代码发送给该用户 相同的代码被bcrypt'并插入数据库中的一个专用列中 用户输入通过电子邮件发送给他们的代码 根据基于存储的bcrypt密码进行检查 (如果全部正确)允许用户输入新密码 无论是代码还是链接,在安全性方面都没有区别 链接所做的只是自动输入代码并提交表单;链接的唯一缺点是,一些(我认为不好的)电子邮件

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

程序是

  • 用户通过输入电子邮件地址触发密码重置
  • 在DB中检查电子邮件是否为真正用户
  • 电子邮件以随机生成的代码发送给该用户
  • 相同的代码被bcrypt'并插入数据库中的一个专用列中
  • 用户输入通过电子邮件发送给他们的代码
  • 根据基于存储的bcrypt密码进行检查
  • (如果全部正确)允许用户输入新密码

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

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

    就安全性而言,电子邮件并不是最安全的媒介,因为一旦邮件离开您的电子邮件服务器,您就无法强制执行加密-如果碰巧转发该电子邮件的邮件服务器不支持加密,它们会将未加密的邮件传递到下一个服务器,等等

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


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

    不,这没什么错。安全性是一样的,只是可行性问题。对于用户来说,复制和粘贴代码(尤其是移动用户)更痛苦。这是一个很好的答案。