2014-11-23 103 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/*