【问题标题】:PHP managing forgot password [closed]PHP管理忘记密码[关闭]
【发布时间】:2017-04-03 14:44:04
【问题描述】:

我正在处理忘记密码的页面,并试图找出最好的方法。目前,当用户访问该页面时,它会询问他们的电子邮件。该脚本检查该帐户是否存在,并向他们发送一封电子邮件,其中包含一个链接以单击以重置其密码。

该链接包含一个令牌(即md5(uniqid()))和当用户选择新密码时与数据库匹配的电子邮件地址。它将令牌存储在数据库表password_resets 中,以及从现在起 24 小时的到期日期以及他们帐户详细信息的外键。

当用户选择一个新密码时,它会将令牌与password_resets 表匹配,将电子邮件发送到该外键的电子邮件地址,并确保在设置新密码和删除记录之前,到期日期是将来的password_resets.

这是一种有效的方法吗?为此目的拥有一张完整的桌子似乎是多余的。有没有更好的方法?

【问题讨论】:

  • 效率很高,应该没有问题。只需制作一个 cron 脚本来刷新过时的令牌。或者,您可以使用 JWT 令牌实现,这将消除对任何数据库的需求。
  • 有点离题但uniqid() does not generate cryptographically secure values 所以你应该考虑使用替代随机函数,例如openssl_random_pseudo_bytes()
  • @this.lau_ 他们对md5(uniqid()) 的使用并不是唯一使用uniqid() 并且与密码学无关,它只是用作非常适合的唯一令牌。他们没有提及或可能不知道的是使用安全(密码)散列函数,例如password_hash()。我认为这个问题超出了他们发布的内容。所以是的,有点跑题了 ;-) openssl_random_pseudo_bytes() 也可能无法在他们的服务器上使用。
  • @Fred-ii- 好点。澄清一下,我使用password_hash() 作为密码。
  • @Tomjr260 回答这个问题:我认为你想做的事情没有任何错误(逻辑)。这是一种(仍然)被广泛使用的方法。如果您认为额外的工作是值得的,那么它是;-)

标签: php mysql web forgot-password


【解决方案1】:

通常我会推荐相同的方法,但我注意到您以一种有效的方式编写了相同的方法。实际上可以有一个。我正在使用following

<?php
    # $key is super secret
    $key = "someRandomKey";
    function gen_token($email,$username) {
        $token = array(
            "email" => $email,
            "username" => $username,
            "created" => time()
        );
        return JWT::encode($token, $key);
    }

    function validate_token($token,$newPassword) {
        # Step below only works on valid token generates on your server
        $data = (array) JWT::decode($jwt, $key, array('HS256'));
        $currentTime = time();
        # Validate difference between $currentTime and $data["created"]
        # If time valid update password
    }
?>

此方法将大大减少数据库延迟,并让您可以选择在令牌本身上存储一些验证数据。

【讨论】:

    猜你喜欢
    • 2016-05-19
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 2011-09-28
    • 1970-01-01
    相关资源
    最近更新 更多