2014-11-23 95 views
2

我正在使用laravel的Auth密码重置方法,并不确定我完全理解哪些部分在所有这些中扮演着令牌。“密码”在密码重置中扮演什么角色?

  1. 我发送给用户Password::remind('[email protected]')电子邮件,它产生在我password_reminders表的令牌。令牌在url中完全可见。

  2. 用户转到一个类似于:mywebsite.com/remindpass/xxxxxx[token]的网址。

  3. 然后他用他的email和一个新的password填好一张表格,将它发送给一个控制器 - 它使用Password::reset('email','password','xxxxxx')

问题是如何安全?生成的令牌会如何防止某人仅仅喜欢mywebsite.com/remindpass/xxxxxx[token]并更改电子邮件密码&?

有人可以澄清过程吗?

+1

据我所知,它没有任何阻止。我认为这只是“某人”不知道令牌,并且在一段时间后过期会使其“足够安全”。 – lukasgeiter 2014-11-23 16:49:08

回答

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来生成令牌。您可以在PHP手册页中阅读关于openssl_random_pseudo_bytes的函数,但基本上它会生成一个密码强的随机字符串。然后Laravel接受这个字符串(仍然是随机方法),base 64编码它,替换一些字符,并根据默认设置16(参见定义$length = 16)或调用者传递给方法的长度。

因此,您会得到一个字符串,它的加密性很强,然后作为您的令牌进行操作。

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

对于有人猜测字符串和具有该标记的用户记录的id会非常困难,并需要知道您的应用程序的业务逻辑。

1

生成的令牌如何防止某人仅仅去mywebsite.com/remindpass/xxxxxx[token]并根据自己喜好更改电子邮件密码&?

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

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

  • 龙(更难猜测)令牌
  • 时间有限的令牌
  • IP的速率限制访问/remindpass/*