PHP管理忘了密码

时间:2016-11-20 00:01:42

标签: php mysql web forgot-password

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

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

当用户选择新密码时,它会将令牌与password_resets表格相匹配,该电子邮件与该外键的电子邮件地址相关联,并确保在设置新密码和删除之前设置过期日期。来自password_resets的记录。

这是一种有效的方法吗?为此目的设置整个表几乎是多余的。有没有更好的方法呢?

1 个答案:

答案 0 :(得分:3)

通常我会推荐相同的方法,但我注意到你以同样的方式写了一个有效的方法。实际上可以有一个。我正在使用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
    }
?>

此方法可以显着减少数据库延迟,还可以选择在令牌本身上存储一些验证数据。