“令牌”在密码重置中扮演什么角色?

时间:2014-11-23 16:16:18

标签: php authentication laravel

我使用了laravel的Auth密码重置方法,并且不确定我是否完全理解在所有这些中扮演令牌的部分。

  1. 我向用户发送了一封Password::remind('email@email.com')的电子邮件,该电子邮件会在我的password_reminders表格中生成一个令牌。令牌在网址中完全可见。

  2. 用户访问的网址类似于:mywebsite.com/remindpass/xxxxxx[token]

  3. 然后他用email和新password填写表单,然后通过帖子发送给控制器 - 使用Password::reset('email','password','xxxxxx')
  4. 问题是这是如何安全的?生成的令牌可以阻止有人前往mywebsite.com/remindpass/xxxxxx[token]并更改电子邮件&他喜欢的密码?

    有人可以澄清过程吗?

2 个答案:

答案 0 :(得分:3)

我确信有人能比我更好地回答这个问题。

简短回答:

该令牌使得某人在使电子邮件中的重置链接可用时,更难以猜测重置密码所需的凭据。

答案很长:

在文件vendor/laravel/framework/src/Illuminate/Auth/Guard.php中,您会看到方法createRememberTokenIfDoesntExist。此方法实际上引用了名为refreshRememberToken的另一个方法来设置您的令牌。

它使用laravel辅助函数str_random。如果您将此功能追溯到它的来源,您会发现它使用vendor/laravel/framework/src/Illuminate/Support/Str.php类'random方法。

public static function random($length = 16)
{
    if (function_exists('openssl_random_pseudo_bytes'))
    {
        $bytes = openssl_random_pseudo_bytes($length * 2);

        if ($bytes === false)
        {
            throw new \RuntimeException('Unable to generate random string.');
        }

        return substr(str_replace(array('/', '+', '='), '', base64_encode($bytes)), 0, $length);
    }

    return static::quickRandom($length);
}

现在我们终于找到了构建令牌的位置。此方法使用函数openssl_random_pseudo_bytes生成令牌。您可以在openssl_random_pseudo_bytes的PHP手册页中阅读有关该功能的信息,但基本上它会生成加密强大的随机字符串。

然后Laravel接受此字符串(仍在随机方法中),base 64对其进行编码,替换一些字符,并根据默认设置16(在参数定义{{1}中看到)获取该字符串的片段})或调用者传递给方法的任何长度。

因此,您将获得一个加密强大的字符串,然后将其作为您的令牌进行操作。

如果您查看文件$length = 16并找到方法vendor/laravel/framework/src/Illuminate/Auth/DatabaseUserProvider.php,您会看到laravel同时使用用户记录ID和令牌来查找密码需要更改的用户。

有人猜测该字符串并且具有该令牌的用户记录的id将非常困难,并且需要了解应用程序的业务逻辑。

答案 1 :(得分:1)

  

生成的令牌可以阻止有人前往mywebsite.com/remindpass/xxxxxx[token]并更改电子邮件&他喜欢的密码?

因为只有您和您发送电子邮件的人(即帐户持有人)才知道令牌是什么。

强大的实施将采取措施,难以猜出令牌:

  • 长(难以猜测)令牌
  • 限时令牌
  • 基于IP的速率限制,可访问/remindpass/*