重置密码:什么是优雅的解决方案?

时间:2013-01-06 06:44:31

标签: php email forgot-password

问题:

如何在不需要安全问题,D.O.B或任何其他参数的情况下验证谁在重置密码?

上下文

在许多网站上,当请求密码重置时,随机哈希附加到数据库中的用户名。此哈希值作为电子邮件中URL的一部分发送给用户。当用户点击通过电子邮件发送的链接时,会将其发送到可以选择新密码的页面。这里的问题是,用户可以在此“设置新密码”页面上键入任何电子邮件地址,并为该帐户设置新密码。那么如何验证用户实际拥有他们设置新密码的帐户?

我认为包含随机哈希的URL应该作为参数与新密码一起发送,因为密码只能在哈希匹配时设置。但是这不起作用,因为$ _GET ['hash']变量仅存在于设置密码页面上,该页面是从电子邮件链接的。一旦用户点击“提交”,$ _GET ['hash']变量就会消失。

简单的解决方案是通过提交中的URL传递$ _GET ['hash']变量AGAIN,但这会为开发人员创建一个额外的步骤,并可能使他们感到困惑。 (我正在创建一个库,所以我的代码必须足够简单,以便开发人员理解和集成)。

以前人们如何处理这个问题?有些人建议使重置链接有时间限制。这将有所帮助,如果说该链接仅在30分钟内有效,那么这意味着如果该人在过去30分钟内请求重置,则恶意用户只能更改别人的密码。但是,那里仍然存在一个漏洞,所以它并不完美。

如果需要,请要求澄清。

谢谢

3 个答案:

答案 0 :(得分:1)

只有正确的用户才会点击电子邮件中的链接 您可以在用户输入新密码的表单中传递哈希:

$hash = $_GET["hash"];

...

<form name="newpasswordform">
...
<input type="hidden" name="thehash" value="<?php echo $hash?>"
...
</form>

这样,您可以在提交表单时重新验证哈希值。

答案 1 :(得分:0)

我已经完成了(不是说它是最优雅的解决方案,但它有效:P):

发送包含http://mysite.com/resetpwd.php?code=1234&email=hello@hi.com等网址的电子邮件,其代码是用户当前电子邮件和散列密码的哈希值。

用户点击链接,代码验证“1234”是“hello@hi.com”的散列和散列密码,然后显示密码重置页面,确保添加“1234”和“hello@hi.com” “将表单中的参数传递给下一页。当他们点击Enter时,会发送到http://mysite.com/resetpwd.php?code=1234&email=hello@hi.com&newpass=hellothere123

Resetpwd.php检查$ _GET ['newpass'],如果再次验证1234是用户哈希密码的哈希值和hello@hi.com,则重置密码。

编辑:哦,我明白了,你不想再次传递验证码......忽略这一点,除非我想出一个更好的解决方案:)

答案 2 :(得分:0)

我看到一些网站为实现更高级别的安全性而做的是让您指定安全问题和答案。所以除了哈希之外,你还会匹配安全问题(“你最喜欢的宠物是什么?”),现在你确认它是用户。
如果没有像bankofamerica.com那样实施其他安全措施,你可以选择一张图片,还有一个问题等等,这可能会非常安全。

相关问题