【问题标题】:Resetting passwords: What is an elegant solution?重置密码:什么是优雅的解决方案?
【发布时间】:2012-12-20 05:47:29
【问题描述】:

问题:

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

背景

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

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

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

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

如果需要,请要求澄清。

谢谢

【问题讨论】:

  • "用户可以在此“设置新密码”页面上输入任何电子邮件地址" - 为什么?您的“我忘记了密码”逻辑应查找与输入的用户名/电子邮件地址关联的帐户,将链接发送到该帐户的关联电子邮件地址,“设置新密码”表单应自动确定此密码更改链接的帐户是为了。
  • 只有正确的用户会点击电子邮件中的链接。
  • 当他们重置密码时,你为什么要他们的电子邮件????这太可怕了。只需在提交表单时使用哈希查找即可!
  • 是的,你们是对的,我根本不应该要求用户的电子邮件。

标签: php email forgot-password


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      我已经完成了(不是说这是最优雅的解决方案,但它确实有效: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 的哈希,然后重置密码。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-18
        • 1970-01-01
        • 2016-06-22
        • 2018-04-28
        • 1970-01-01
        • 2015-07-03
        • 2011-03-31
        • 2011-02-13
        相关资源
        最近更新 更多