2016-11-20 139 views
0

我正在處理一個忘記密碼的頁面,並試圖找出最好的方法來做到這一點。目前,當用戶轉到頁面時,它會要求提供他們的電子郵件。該腳本檢查該帳戶是否存在,並向他們發送帶有鏈接的電子郵件以點擊重置其密碼。PHP管理忘記密碼

該鏈接包含一個令牌(僅僅是md5(uniqid()))和用戶選擇新密碼時與數據庫匹配的電子郵件地址。它將令牌存儲在數據庫表password_resets以及從現在開始的24小時到期日期以及其帳戶詳細信息的外鍵。

當用戶選擇一個新密碼時,它將令牌與password_resets表相匹配,並將該電子郵件發送到該外鍵的電子郵件地址,並在設置新密碼並從password_resets刪除記錄之前確保到期日期在將來。

這是一個有效的方法嗎?用於此目的的整個表格似乎是多餘的。有沒有更好的方法來做到這一點?

+1

它是有效的,你不應該有任何問題。只需製作一個cron腳本來刷新過時的令牌。或者,您可以使用JWT令牌實現,這將消除對任何數據庫的需求。 – georoot

+3

有點偏離主題,但'uniqid()'[不生成加密安全值](https://secure.php.net/manual/en/function.uniqid.php),所以你應該考慮使用一個替代隨機函數如''openssl_random_pseudo_bytes()' –

+1

@ this.lau_他們使用'md5(uniqid())'並不是唯一的使用'uniqid()',並且與加密無關,它只能被用作唯一的令牌這非常適合。他們沒有提及或可能不知道的是使用安全(密碼)散列函數,如'password_hash()'。我認爲這個問題超出了他們發佈的內容。所以是的,有點偏離主題;-)''openssl_random_pseudo_bytes()'可能無法在其服務器上使用。 –

回答

3

通常我會推薦相同的方法,但我注意到你寫了一個有效的方式相同。可以有一個actually.I現在用的是following

<?php 
    # $key is super secret 
    $key = "someRandomKey"; 
    function gen_token($email,$username) { 
     $token = array(
      "email" => $email, 
      "username" => $username, 
      "created" => time() 
     ); 
     return JWT::encode($token, $key); 
    } 

    function validate_token($token,$newPassword) { 
     # Step below only works on valid token generates on your server 
     $data = (array) JWT::decode($jwt, $key, array('HS256')); 
     $currentTime = time(); 
     # Validate difference between $currentTime and $data["created"] 
     # If time valid update password 
    } 
?> 

這種方法會減少數據庫延遲相當,也爲您提供了一些驗證數據存儲在令牌本身的選項。