0

问题:

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

上下文

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

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

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

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

如果需要,请要求澄清。

谢谢

4

3 回答 3

1

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

$hash = $_GET["hash"];

...

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

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

于 2013-01-06T06:52:01.567 回答
0

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

于 2013-01-06T06:52:47.897 回答
0

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

使用http://mysite.com/resetpwd.php?code=1234&email=hello@hi.com之类的 URL 发送电子邮件,其中代码是用户当前电子邮件的哈希值和哈希密码。

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

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

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

于 2013-01-06T06:51:28.597 回答