【发布时间】:2012-12-20 05:47:29
【问题描述】:
问题:
如何在不需要安全问题、D.O.B 或任何其他参数的情况下验证谁在重置密码?
背景
在许多网站上,当请求重置密码时,数据库中的用户名会附加一个随机哈希。此哈希作为 URL 的一部分在电子邮件中发送给用户。当用户点击电子邮件链接时,他们会被发送到一个页面,他们可以在其中选择新密码。这里的问题是,用户可以在此“设置新密码”页面上输入任何电子邮件地址,并为该帐户设置新密码。那么如何验证用户是否真正拥有他们设置新密码的帐户?
我认为包含随机哈希的 URL 应该作为参数与新密码一起发送,因为只有当哈希匹配时才能设置密码。但是,这不起作用,因为 $_GET['hash'] 变量仅存在于从电子邮件链接的设置密码页面上。一旦用户单击“提交”,$_GET['hash'] 变量就消失了。
简单的解决方案是通过提交时的 URL 再次传递 $_GET['hash'] 变量,但这为开发人员创建了一个额外的步骤,并且可能会使他们感到困惑。 (我正在创建一个库,所以我的代码必须足够简单,以便开发人员理解和集成)。
人们以前是如何解决这个问题的?有人建议让重置链接有时间限制。这将有所帮助,如果说链接仅在 30 分钟内有效,那么这意味着恶意用户只有在该人在过去 30 分钟内请求重置时才能更改其他人的密码。但是,那里仍然存在漏洞窗口,因此并不完美。
如果需要,请要求澄清。
谢谢
【问题讨论】:
-
"用户可以在此“设置新密码”页面上输入任何电子邮件地址" - 为什么?您的“我忘记了密码”逻辑应查找与输入的用户名/电子邮件地址关联的帐户,将链接发送到该帐户的关联电子邮件地址,“设置新密码”表单应自动确定此密码更改链接的帐户是为了。
-
只有正确的用户会点击电子邮件中的链接。
-
当他们重置密码时,你为什么要他们的电子邮件????这太可怕了。只需在提交表单时使用哈希查找即可!
-
是的,你们是对的,我根本不应该要求用户的电子邮件。
标签: php email forgot-password