Как заблокировать пользователя после 3 попыток входа в систему и сохранить его в базе данных? Я уже добавляю два столбца в таблицу пользователя, один для числа попыток входа и второй, для даты и времени последнего входа. Пожалуйста, помогите мне, как это сделать. Я не очень хорош в PHP.
благодаря
session_start(); $ipaddress = ''; if (getenv('HTTP_CLIENT_IP')) $ipaddress = getenv('HTTP_CLIENT_IP'); else if(getenv('HTTP_X_FORWARDED_FOR')) $ipaddress = getenv('HTTP_X_FORWARDED_FOR'); else if(getenv('HTTP_X_FORWARDED')) $ipaddress = getenv('HTTP_X_FORWARDED'); else if(getenv('HTTP_FORWARDED_FOR')) $ipaddress = getenv('HTTP_FORWARDED_FOR'); else if(getenv('HTTP_FORWARDED')) $ipaddress = getenv('HTTP_FORWARDED'); else if(getenv('REMOTE_ADDR')) $ipaddress = getenv('REMOTE_ADDR'); else $ipaddress = 'UNKNOWN'; $loginDate = date("Ymd H:i:s"); $Error =""; $successMessage =""; if (isset($_POST['submit'])){ if ( !( $_POST['cnumber'] == "" && $_POST['password'] == "")){ $cnumber=$_POST['cnumber']; $password= sha1($_POST['password']); $cnumber = filter_var($cnumber, FILTER_SANITIZE_NUMBER_INT); if (filter_var($cnumber, FILTER_VALIDATE_INT)){ $con=mysqli_connect("localhost","root","","users"); $result = mysqli_query($con, "SELECT * FROM users WHERE contractNumber='$cnumber' AND password='$password'"); $data = mysqli_num_rows($result); if($data==1){ $_SESSION['login_user']=$cnumber; mysqli_query($con, "INSERT INTO `users`.`logs`(`contractNumber`, `lastLogin`, `ipAddress`) VALUES ('$cnumber', '$loginDate', '$ipaddress')"); header('Location: profile.php'); } else { $Error ="Invalid Contract Number or Password."; mysqli_query($con, "UPDATE users SET loginAttempt = loginAttempt + 1 WHERE contractNumber = '$cnumber' "); print_r(mysqli_affected_rows($con)); } mysqli_close($con); } else { $Error ="Invalid Contract Number."; } } else { $Error ="Contract Number or Password is Empty."; } }
Аналогичные вопросы и ответы можно найти в этом потоке: добавьте поле базы данных на 1
На самом деле попытки входа в систему должны храниться отдельно от таблицы пользователя. Вы можете заблокировать попытки входа, сохранив количество попыток на стороне клиента (количество попыток в cookie) или сохраните IP-адрес пользователя, пытающегося войти в систему с количеством попыток на стороне сервера (в вашей базе данных SQL); увеличивая количество попыток за каждый неудачный логин. Метод cookie имеет недостаток, заключающийся в том, что он легко обходит атакующего. Метод IP-адреса сложнее обойти, но имеет недостаток блокирования людей, использующих один и тот же IP-адрес. Я бы использовал немного обоих методов; применяя такие правила, как 3 попытки для файла cookie и 15 попыток для таблицы IP-адресов / попыток.
IP address variable: $_SERVER["REMOTE_ADDR"]; Getting cookies: $_COOKIE["cookie_name"]; Setting cookies: setcookie("cookie_name", "value", time()+$seconds);
Основная реализация метода cookie:
// before login attempt: $attempt_count = intval(@$_COOKIE["login_count"]); if($attempt_count > 3){ die("Too many attempts"); }
_
// on failed login attempt: setcookie("login_count", $login_count+1, time()+600); // cookie set to expire at (now+600 seconds); 10 minutes
Сначала, когда пользователь пытается с неправильным паролем, вам нужно увеличить количество попыток входа в систему на единицу. Затем проверьте количество попыток входа в систему равным 3 или нет. если это 3 означает, то заблокируйте пользователя, изменив их статус
$result = mysqli_query($con, "SELECT * FROM Users WHERE contractNumber='$cnumber' AND password='$password'"); $data = mysqli_num_rows($result); if($data==1) { $_SESSION['login_user']=$cnumber; // Initializing Session header('Location: profile.php'); } else { mysqli_query($con, "UPDATE tablename login_attempts = login_attempts+1 WHERE contarct_number = ". $cnumber"); /*Select query login attempts and check the count*/ }