【问题标题】:What part does the "token" play in password reset?“令牌”在密码重置中起什么作用?
【发布时间】:2014-11-23 16:16:18
【问题描述】:

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

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

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

  3. 然后他用他的email 和一个新的password 填写了一个表格,然后将其通过邮件发送到一个使用Password::reset('email','password','xxxxxx') 的控制器。

问题是这如何安全?生成的令牌有什么作用来防止有人只是去mywebsite.com/remindpass/xxxxxx[token] 并随意更改电子邮件和密码?

有人可以澄清一下过程吗?

【问题讨论】:

  • 据我所知,它并没有阻止这种情况发生。我认为只是“某人”不知道令牌并且它会在一段时间后过期,这使得它“足够安全”。

标签: php authentication laravel


【解决方案1】:

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

简答:

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

长答案:

在文件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 获取该字符串的切片(见参数定义 $length = 16)或调用者传递给方法的任何长度。

因此,您会得到一个密码强度较高的字符串,然后将其作为您的令牌进行操作。

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

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

【讨论】:

    【解决方案2】:

    生成的令牌有什么作用来防止有人只是去mywebsite.com/remindpass/xxxxxx[token] 并随意更改电子邮件和密码?

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

    一个强大的实现将采取措施使猜测令牌变得困难:

    • 长(更难猜)标记
    • 限时令牌
    • 基于 IP 的速率限制访问/remindpass/*

    【讨论】:

      猜你喜欢
      • 2018-06-21
      • 1970-01-01
      • 2014-06-20
      • 1970-01-01
      • 2021-08-11
      • 2019-10-07
      • 1970-01-01
      • 2012-09-16
      • 2017-04-21
      相关资源
      最近更新 更多