2015-12-22 179 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是时间戳格式。因此,这种逻辑似乎不起作用。 –