محدود کردن تعداد لاگین اشتباه با PHP
محدود کردن تعداد لاگین PHP – در این آموزش پروژه را طوری خواهیم ساخت در صورتی که کاربر 3 بار رمز یا نام کاربری را اشتباه وارد کند آیپی آن وارد لیست سیاه شود و تا 60 ثانیه امکان لاگین نداشته باشد .
با 2 جدول در دیتابیس cms کار خواهیم کرد :
- users : جدول لیست کاربران بررسی درستی نام کاربری و رمز عبور
- login_request : در هر لاگین اشتباه آیپی کاربر به اضافه زمان ارسال درخواست و زمان آزاد شدن از لیست سیاه ذخیره می شود
دموی برنامه
اسکریپت 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 وارد پایگاه داده کنید .
ارسال نظر