2016-08-30 12 views
-3

ipを使用して3回間違ったログイン試行をした後、一定時間ユーザーをブロックします。 私の問題は、カウンターがまだ間違っているデータを入力するたびに常にカウンターが1であることです。 私は以下のコードで間違っていますか? IPログイン試行が3回失敗した場合にPHPがログインページへのアクセスをブロックする

<?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ではなく、失敗した行をUPDATEします。それで、あなたは常に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;}}?> 

はまた、あなたが昔のログインのテーブルをクリアするために、ある種のcronジョブを実行したいと思うでしょうとき、

表名が
COLSを試みます。自分のサーバーでは、1か月以上経過しているログインデータをクリアしています。それは毎晩深夜に実行されます。失敗したログインのみを保存している場合は、毎晩古いX分の行をすべて消去することができます。

関連する問題