محدود کردن تعداد لاگین اشتباه با PHP

محدود کردن تعداد لاگین اشتباه با PHP

محدود کردن تعداد لاگین PHP – در این آموزش پروژه را طوری خواهیم ساخت در صورتی که کاربر 3 بار رمز یا نام کاربری را اشتباه وارد کند آیپی آن وارد لیست سیاه شود و تا 60 ثانیه امکان لاگین نداشته باشد .
با 2 جدول در دیتابیس cms کار خواهیم کرد :

  1. users : جدول لیست کاربران بررسی درستی نام کاربری و رمز عبور
  2. login_request : در هر لاگین اشتباه آیپی کاربر به اضافه زمان ارسال درخواست و زمان آزاد شدن از لیست سیاه ذخیره می شود

دموی برنامه

برنامه محدودیت لاگین با PHP


اسکریپت index.php

<?php

if(@$_POST['username'] && @$_POST['password']){
	require_once "db.php";
}else if(@$_POST['username'] || @$_POST['password']){
	$msg = "نام کاربری یا رمزعبور را وارد نکرده اید";
}

?>
<!DOCTYPE html>
<html lang="fa">
<head>
    <meta charset="UTF-8">
    <title>Rapidcode.iR - سورس کد</title>
    <link rel="stylesheet" href="./static/css/main.css">
</head>
<body>

    <div class="container">
        <a id="introduce" href="https://rapidcode.ir" target="_blank">رپید کد • کتابخانه مجازی برنامه نویسان</a>
		
		<?php if(isset($is_valid) && $is_valid): ?>
			<div id="message"><?php echo $msg ?></div>
		<?php else : ?>
			<div id="message"><?php echo @$msg ?></div>
			<form method="POST" action="">
			<label for="username">نام کاربری :</label>
			<input type="text" name="username" id="username">
			<label for="password">رمزعبور :</label>
			<input type="password" name="password" id="password">
			<button>ورود</button>
			</form>
		<?php endif; ?>
		

       
    </div>



</body>
</html>


اسکریپت db.php جهت احراز هویت کاربر و لیست سیاه ip

<?php

$mysqli = new mysqli("localhost", "root", "", "cms");
if ($mysqli->connect_error) {
    die("MYSQL ISSUE : " . $mysqli->connect_error);
}

$username = $_POST['username'];
$password = $_POST['password'];
 
$timestamp = time();
$seconds_time = 60;
$timestamp_release = $timestamp + $seconds_time; // one minute
$max_attempt_login = 3;
$user_ip = $_SERVER['REMOTE_ADDR'];

$mysqli->set_charset("utf8");
$stmt = $mysqli->stmt_init();
 

function getData($uquery, $data){
	global $stmt;
	$query = $uquery;
	$rows = [];
 
	$stmt->prepare($query);
	$stmt->bind_param(str_repeat("s", sizeof($data)), ...$data);
 
	if ($stmt->execute() && $res = $stmt->get_result()) {
		if ($stmt->affected_rows || $res->num_rows) {
			while ($row = $res->fetch_assoc()) {
				$rows[] = $row;
			}
		}	
	}
 
	return $rows;
}

function setData($uquery, $data){
	global $stmt;
	$query = $uquery;
	$rows = [];
	$stmt->prepare($query);
	$stmt->bind_param(str_repeat("s", sizeof($data)), ...$data);
	$inserted_id = 0;
	if ($stmt->execute()) 
	  $inserted_id = $stmt->affected_rows ? $stmt->insert_id : 0;
	
	return $inserted_id;
}

function getAttemptChange($rows, $max_attempt_login){
	$attempt_login = count($rows);
	$remain_chance = $max_attempt_login - $attempt_login;
	return $remain_chance;
}

$attempt_login = getData("SELECT * FROM `login_request` WHERE ip=? AND ? < release_timestamp", [$user_ip, $timestamp]);
$remain_chance = getAttemptChange($attempt_login, $max_attempt_login);

if($remain_chance < 1){
	$last_request = $attempt_login[0];
	$future_release_time = $last_request['release_timestamp'] - $timestamp;
	$msg = "در حال حاضر آیپی شما در لیست سیاه می باشد و تا {$future_release_time} ثانیه دیگر آزاد خواهد شد";
}else{


$user = getData("SELECT * FROM `users` WHERE username=?", [$username]);
$user = end($user);

$user_db_password = @$user['password'];
$is_valid = password_verify($password, $user_db_password);


if(!$is_valid || empty($user)){
	$query = "INSERT INTO `login_request` (ip , timestamp , release_timestamp) VALUES (? , ? , ?)";
	$inserted_id = setData($query, [$user_ip, $timestamp, $timestamp_release]);
	if(!$inserted_id) die("inserted id: {$inserted_id}");
	
	$attempt_login = getData("SELECT * FROM `login_request` WHERE ip=? AND ? < release_timestamp", [$user_ip, $timestamp]);
	$remain_chance = getAttemptChange($attempt_login, $max_attempt_login);
	
	$msg = 1 <= $remain_chance ? "نام کاربری یا رمز عبور اشتباه است {$remain_chance} فرصت دیگر" : "آیپی شما به لیست سیاه اضافه گردید و تا {$seconds_time} ثانیه دیگر امکان لاگین وجود ندارد";
}else{
	$msg = "{$user['username']} با موفقیت وارد شدید .";
}

}

 
$stmt->close();
$mysqli->close();

?>

قبل از اجرای برنامه دیتابیس cms را از پوشه DATABASE وارد پایگاه داده کنید .


دانلود پروژه محدود کردن تعداد لاگین PHP

ارسال نظر

جهت استفاده از کد حتما از تگ pre استفاده نمایید .

contact us