我使用了laravel的Auth密码重置方法,并且不确定我是否完全理解在所有这些中扮演令牌的部分。
我向用户发送了一封Password::remind('email@email.com')
的电子邮件,该电子邮件会在我的password_reminders
表格中生成一个令牌。令牌在网址中完全可见。
用户访问的网址类似于:mywebsite.com/remindpass/xxxxxx[token]
。
email
和新password
填写表单,然后通过帖子发送给控制器 - 使用Password::reset('email','password','xxxxxx')
。问题是这是如何安全的?生成的令牌可以阻止有人前往mywebsite.com/remindpass/xxxxxx[token]
并更改电子邮件&他喜欢的密码?
有人可以澄清过程吗?
答案 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]
并更改电子邮件&他喜欢的密码?
因为只有您和您发送电子邮件的人(即帐户持有人)才知道令牌是什么。
强大的实施将采取措施,难以猜出令牌:
/remindpass/*