2015-12-22 183 views
0

在最近15分鐘內4次登錄嘗試失敗後,讓用戶驗證驗證碼的正確方法是什麼?我已經得到了一切正常,但沒有時間戳查詢的一部分。更具體地講,可顯示的驗證碼後,4失敗的嘗試,當用戶嘗試登錄5次左右就可以,不管15分鐘或30分鐘是否已經過去了......使用時間戳限制不正確的登錄嘗試次數

$query1 = "SELECT login_attempts from users WHERE email = '$email' AND last_login < NOW() - INTERVAL 15 MINUTE"; 
$result1 = mysqli_query($dbc, $query1) OR die(mysqli_error()); 
$row = mysqli_fetch_array($result1); 
$fail = (int)$row['login_attempts']; 
+0

我會嘗試使用一個單獨的表的登錄嘗試,有外鍵的用戶表上的主鍵字段「user_id說明」我猜。只需要用user_id和timestamp組成一個小表,然後你可以在給定的時間間隔內通過user_id進行COUNT次嘗試。 INSERT比UPDATE少徵稅;再加上您將擁有該用戶的失敗登錄嘗試的完整歷史記錄。 – doublesidedstickytape

回答

2

如果我的理解是正確的,您必須檢查第4次最後一次不成功的登錄嘗試是否在15分鐘之前。

爲實現此目的,您必須將最後四次失敗登錄的時間戳存儲在數據庫中。

  1. 在數據庫中創建一個名爲unsuccesful_login_timestamps的字段作爲text或varchar,其大小較大。我們將在此字段中以逗號分隔的形式存儲最後四次不成功登錄的UNIX時間戳。
  2. 當用戶試圖登錄,實現以下邏輯

    如果用戶名和密碼是有效的,讓用戶登錄(您可以清除unsuccesful_login_timestamps領域,如果你想在登錄成功的是)。否則,運行以下代碼。

    $last_login_string = {{ get unsuccesful_login_timestamps value for this user from database }} 
    $last_login_string = update_last_login($last_login_string); 
    $fourth_last_login = get_4th_last_login($last_login_string); 
    $time_difference = time() - $fourth_last_login; 
    
    {{Update unsuccesful_login_timestamps in db with $last_login_string}} 
    
    if($time_difference <900){ 
        //show captcha 
    }else{ 
        //no_need_for_captcha 
    } 
    //Method to update last 4 unsuccessful logins by removing 
    // the last one from the starting and append the latest time in the end 
    function update_last_login($last_login_string){ 
        $time_array = array(); 
        if(strlen($last_login_string) > 0){ 
         $time_array = explode(",",$last_login_string); 
         $size = count($time_array); 
         if($size ==0){ //first attempt 
          $last_login_string = time(); 
         }else if($size == 4){ //>=4th attempt 
          $time_array[4]=time(); 
          array_shift($time_array); 
          $last_login_string = implode(",",$time_array); 
         }else{ // >0, but <4 attempts 
          $time_array[$size]=time(); 
          $last_login_string = implode(",",$time_array); 
         } 
         return $last_login_string; 
        }else{ 
         return time(); 
        } 
    } 
    
    function get_4th_last_login($last_login_string){ 
        $time_array = array(); 
        $time_array = explode(",",$last_login_string); 
        if($size !=4){ 
         $last_login_time time(); 
        }else{ 
         $last_login_time = $time_array[0]; 
        } 
        return $last_login_time; 
    } 
    
0

編輯:這個答案是假設你是保存時間戳(使用time()$_SERVER['REQUEST_TIME'])作爲last_login的價值列在users表中。

你可以做的是使用$_SERVER['REQUEST_TIME']聲明$time變量,做這樣的事情:

$time = $_SERVER['REQUEST_TIME'] - 900; // Current time minus 900 seconds (15 minutes) 
$query1 = "SELECT login_attempts from users WHERE email = '$email' AND last_login < $time"; 

如果你想改變的持續時間,只是改變了900任何值(單位:秒)你想。

+0

比你@BryanLavinParmenter,你是對的,我有last_login作爲TIMESTAMP,它只能識別秒,因此它現在工作.... –

+0

抱歉,但看起來我太興奮了,無法徹底檢查你的答案。我的last_login是時間戳格式。因此,這種邏輯似乎不起作用。 –