2016-08-30 2 views
-3

Я хочу заблокировать пользователя в течение определенного времени после 3 неправильных попыток входа с использованием ip. моя проблема в том, что счетчик всегда 1 каждый раз, когда я ввожу неверные данные, счетчик по-прежнему 1 любая помощь, где я ошибаюсь в нижнем коде ?!PHP блокирует доступ к странице входа после трех неудачных попыток входа в систему

Имя таблицы попытки
COLS, когда IP-

<?php 
    $dsn = "mysql:host=localhost;dbname=e-check"; 
    $username = "root"; 
    $password = ""; 
    $options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); 
    $pdo = new PDO($dsn, $username, $password, $options); 
$max_time_in_seconds = 5; 
$max_attempts = 3; 
//here i printed to see ht counter number 
echo login_attempt_count($max_time_in_seconds, $pdo) <= $max_attempts; 
if(login_attempt_count($max_time_in_seconds, $pdo) <= $max_attempts){ 
    // login form 
    echo'  
<form action="index_new.php" method="POST"> 
     <table align="left"> 
      <tr><td><span class="caption">login form</span></td></tr> 
      <tr><td colspan="2"><hr></td></tr> 
      <tr><td>name:</td></tr> 
      <tr><td><input type="text" name="uname" required></td> </tr> 
      <tr><td>pass:</td></tr> 
      <tr><td><input type="password" name="psswd" required></td></tr> 
      <tr><td class="button1"><input type="submit" name="submitBtn" value="login" class="button"></td></tr> 
     </table> </form>'; 

} else { 
    echo "<div class='test'>will be blocked for few seconds</div>"; 
}function login_attempt_count($seconds, $pdo) { 
    try { 
     // delete old attempts from the table 
     $del_old = "DELETE FROM attempts WHERE `when` < ?"; 
     $oldest = strtotime(date("Y-m-d H:i:s")." - ".$seconds." seconds"); 
     $oldest = date("Y-m-d H:i:s",$oldest); 
     $del_data = array($oldest); 
     $remove = $pdo->prepare($del_old); 
     $remove->execute($del_data); 
     // insert this attempt into the table 
     $insert = "INSERT INTO attempts (`ip`, `when`) VALUES (?, ?)"; 
     $data = array($_SERVER['REMOTE_ADDR'], date("Y-m-d H:i:s")); 
     $input = $pdo->prepare($insert); 
     $input->execute($data); 
     //count the number of recent attempts from this ip address 
     $count = "SELECT count(*) as number FROM attempts where `ip` = ?"; 
     $num = $pdo->prepare($count); 
     $num->execute(array($_SERVER['REMOTE_ADDR'])); 
     foreach($num as $attempt) { 
      $attempts = $attempt['number']; 
     }return $attempts; 
    } catch (PDOEXCEPTION $e) { 
     echo "Error: ".$e;}}?> 
+1

Увеличьте $ max_time_in_seconds до 60 и проверьте еще раз. –

+0

'WHERE created_at> = DATE_SUB (UTC_TIMESTAMP(), INTERVAL 60 SECOND)' может быть? – tadman

+0

Вы хотите ОБНОВИТЬ строку неудачных попыток, а не INSERT. Вот почему у вас всегда есть 1 счет. Вы всегда вставляете то же самое. –

ответ

0
<?php 
$dsn = "mysql:host=localhost;dbname=e-check"; 
$username = "root"; 
$password = ""; 
$options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); 
$pdo = new PDO($dsn, $username, $password, $options); 
$max_time_in_seconds = 5; 
$max_attempts = 3; 
//here i printed to see ht counter number 
echo login_attempt_count($max_time_in_seconds, $pdo) <= $max_attempts; 
if(login_attempt_count($max_time_in_seconds, $pdo) <= $max_attempts){ 
// login form 
echo'  
<form action="index_new.php" method="POST"> 
    <table align="left"> 
     <tr><td><span class="caption">login form</span></td></tr> 
     <tr><td colspan="2"><hr></td></tr> 
     <tr><td>name:</td></tr> 
     <tr><td><input type="text" name="uname" required></td> </tr> 
     <tr><td>pass:</td></tr> 
     <tr><td><input type="password" name="psswd" required></td></tr> 
     <tr><td class="button1"><input type="submit" name="submitBtn"   value="login" class="button"></td></tr> 
    </table> </form>'; 

} else { 
echo "<div class='test'>will be blocked for few seconds</div>"; 
}function login_attempt_count($seconds, $pdo) { 
try { 
    //do not delete old attempts from the table 

    // insert this attempt into the table 
    $insert = "INSERT INTO attempts (`ip`, `when`) VALUES (?, ?)"; 
    $data = array($_SERVER['REMOTE_ADDR'], CURRENT_TIMESTAMP); 
    $input = $pdo->prepare($insert); 
    $input->execute($data); 
    //count the number of recent attempts from this ip address 
    $count = "SELECT count(*) as number FROM attempts where (when > now() - INTERVAL 5 MINUTE) and `ip` = ?"; 
    $num = $pdo->prepare($count); 
    $num->execute(array($_SERVER['REMOTE_ADDR'])); 
    foreach($num as $attempt) { 
     $attempts = $attempt['number']; 
    }return $attempts; 
} catch (PDOEXCEPTION $e) { 
    echo "Error: ".$e;}}?> 

Кроме того, вы хотите запустить хрон какой-то, чтобы очистить таблицу старых логинов. На моем собственном сервере у меня есть ясные данные для входа, которые старше месяца. Он работает каждую ночь в полночь. Если вы только сохраняете неудавшиеся логины, вы можете очистить все строки старше, чем X минут каждую ночь.

Смежные вопросы