-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;}}?>
$ max_time_in_secondsを60まで増加させ、再度確認してください。 –
'WHERE created_at> = DATE_SUB(UTC_TIMESTAMP()、INTERVAL 60 SECOND)'多分? – tadman
INSERTではなく、失敗した行をUPDATEします。それで、あなたは常に1カウントを持っているのです。あなたは常に同じものを挿入しています。 –