|
ตรวจสอบ Login จำนวนครั้งที่ผิด การแบนเวลา Login ด้วย PHP กับ MySqli (mysqli) |
ตรวจสอบ Login จำนวนครั้งที่ผิด การแบนเวลา Login ด้วย PHP กับ MySqli (mysqli) บทความใหม่เกี่ยวกับการ Login ด้วย PHP กับ MySQL (mysqli) ด้วยฟังก์ชั่นตรวจสอบระบบที่ดีขึ้นกว่าเดิม ด้วยการกำหนดจำนวนครั้งที่ Login ไม่ถูกต้อง เช่น กำหนดจำนวน 3 ครั้ง ซึ่ง User จะสามารถ Login ได้ 3 ครั้งเท่านั้น ถ้า Login ผิดเกินจากนี้ Account จะถูก Lock ทันที สำหรับบทความนี้คิดว่าจะมีประโยชน์สำหรับสมาชิกที่ต้องการจะนำไปใช้ โดยหลักการนั้นก็ไม่ได้ยากอะไร เราเพียงออกแบบสร้างฟิวด์ขึ้นมา 2 ตัวคือ เก็บจำนวนล็อกอินผิด และ เก็บสถานะการ Lock Account ซึ่งกระบวนการก็คือ ให้ไป SELECT ข้อมูลตาม User ที่ Login เข้ามา หลังจากได้ User แล้ว เราจะได้ Password และสถานะอื่น ๆ ตามมาอีกด้วย ซึ่งหลังจากนั้นก็ให้ตรวจสอบ Password ใน Database กับตัวที่ Input เข้ามาว่าตรงกันหรือไม่ ถ้าไม่ตรงกันก็ให้ไป Update ฟิวด์ที่เก็บจำนวนครั้งที่ Login ผิด และถ้าเกินกว่าจำนวนที่กำหนดก็ให้ไป Update ฟิวด์ที่เก็บสถานะ Lock ของ Account และในทางตรงกันข้ามถ้า Login ผ่านก็ควรจะไป Clear ค่าเหล่านี้ด้วย
PHP/MySQL Login (mysqli function) and Lock/Ban Account
นอกจากนี้ยังมีตัวอย่างเกี่ยวกับการ Ban แบบกำหนดระยะเวลา เช่น เมื่อ Login เกิน 3 ครั้ง ระบบจะ Lock เวลาจำนวน 10 นาที โดยภายใน 10 นาทีนั้น User จะไม่สามารถ Login ได้ถูกต้องแน่นอน แต่เมื่อเลยระยะเวลา 10 นาทีออกไปแล้ว ระบบจะ Clear ค่า Ban ให้อัตโนมัติ เพื่อให้ User ทำการ Login ใหม่อีกครั้ง
Example 1 ทำระบบ Login และ User / Password ตรวจสอบจำนวน Login ผิด และ Lock Account
โครงสร้าง Table และ Data
CREATE TABLE `member` (
`UserID` int(3) unsigned zerofill NOT NULL auto_increment,
`Username` varchar(20) NOT NULL,
`Password` varchar(20) NOT NULL,
`Name` varchar(100) NOT NULL,
`LoginCount` int(2) NOT NULL default '0',
`FlagLock` enum('Yes','No') NOT NULL default 'No',
PRIMARY KEY (`UserID`),
UNIQUE KEY `Username` (`Username`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
INSERT INTO `member` VALUES (001, 'rut', 'rut123', 'Wisarut Nukitram', 0, 'No');
INSERT INTO `member` VALUES (002, 'chai', 'chai123', 'Surachai Sirisart', 0, 'No');
![PHP MySQL Login (mysqli) lock ban account PHP MySQL Login (mysqli) lock ban account](https://www.thaicreate.com/upload/stock/20170322135236.jpg?v=1001)
ในตาราง User จะมีฟิวด์ชื่อว่า LoginCount (เก็บจำนวนที่ Login ผิด) และ FlagLock (เก็บสถานะ Account ว่าถูก Lock หรือไม่)
ตัวอย่าง Code
login.php (ฟอร์มสำหรับ Login)
<html>
<head>
<title>ThaiCreate.Com Tutorials</title>
</head>
<body>
<form name="form1" method="post" action="check_login.php">
Login<br>
<table border="1" style="width: 300px">
<tbody>
<tr>
<td> Username</td>
<td>
<input name="txtUsername" type="text" id="txtUsername">
</td>
</tr>
<tr>
<td> Password</td>
<td><input name="txtPassword" type="password" id="txtPassword">
</td>
</tr>
</tbody>
</table>
<br>
<input type="submit" name="Submit" value="Login">
</form>
</body>
</html>
check_login.php (ไฟล์ตรวจสอบการ Login)
<?php
$LimitTime = 3;
session_start();
$serverName = "localhost";
$userName = "root";
$userPassword = "root";
$dbName = "mythaicreate";
$objCon = mysqli_connect($serverName,$userName,$userPassword,$dbName);
$strSQL = "SELECT * FROM member WHERE Username = '".mysqli_real_escape_string($objCon,$_POST['txtUsername'])."' ";
$objQuery = mysqli_query($objCon,$strSQL);
$objResult = mysqli_fetch_array($objQuery,MYSQLI_ASSOC);
if(!$objResult)
{
echo "Not Found User!";
exit();
}
else
{
if($objResult["FlagLock"] == "Yes")
{
echo "This user account is lock!";
exit();
}
if($objResult["Password"] != $_POST["txtPassword"])
{
echo "Password Incorrect!";
// Update Login Failed
$strSQL = "UPDATE member SET LoginCount = LoginCount + 1 WHERE Username = '".mysqli_real_escape_string($objCon,$_POST['txtUsername'])."' ";
$objQuery = mysqli_query($objCon,$strSQL);
// If more than limit time auto lock account
if($objResult["LoginCount"] + 1 >= $LimitTime)
{
$strSQL = "UPDATE member SET FlagLock = 'Yes' WHERE Username = '".mysqli_real_escape_string($objCon,$_POST['txtUsername'])."' ";
$objQuery = mysqli_query($objCon,$strSQL);
}
exit();
}
else
{
// Login Success
$_SESSION["UserID"] = $objResult["UserID"];
session_write_close();
// Reset LoginCount
$strSQL = "UPDATE member SET LoginCount = 0 WHERE Username = '".mysqli_real_escape_string($objCon,$_POST['txtUsername'])."' ";
$objQuery = mysqli_query($objCon,$strSQL);
header("location:user_page.php");
}
}
mysqli_close($objCon);
?>
user_page.php (ไฟล์สำหรับแสดงข้อมูล Login ที่ Login ผ่านแล้ว)
<?php
session_start();
if($_SESSION['UserID'] == "")
{
echo "Please Login!";
exit();
}
$serverName = "localhost";
$userName = "root";
$userPassword = "root";
$dbName = "mythaicreate";
$objCon = mysqli_connect($serverName,$userName,$userPassword,$dbName);
$strSQL = "SELECT * FROM member WHERE UserID = '".$_SESSION['UserID']."' ";
$objQuery = mysqli_query($objCon,$strSQL);
$objResult = mysqli_fetch_array($objQuery,MYSQLI_ASSOC);
?>
<html>
<head>
<title>ThaiCreate.Com Tutorials</title>
</head>
<body>
Welcome to Page! <br>
<table border="1" style="width: 300px">
<tbody>
<tr>
<td width="87"> Username</td>
<td width="197"><?php echo $objResult["Username"];?>
</td>
</tr>
<tr>
<td> Name</td>
<td><?php echo $objResult["Name"];?></td>
</tr>
</tbody>
</table>
<a href="logout.php">Logout</a>
</body>
</html>
<?php
mysqli_close($objCon);
?>
logout.php (ไฟล์สำหรับ Loout ออกจากระบบ)
<?php
session_start();
session_destroy();
header("location:login.php");
?>
Screenshot
![PHP MySQL Login (mysqli) lock ban account PHP MySQL Login (mysqli) lock ban account](https://www.thaicreate.com/upload/stock/20170322135241.jpg?v=1001)
แสดงหน้าจอ Login
![PHP MySQL Login (mysqli) lock ban account PHP MySQL Login (mysqli) lock ban account](https://www.thaicreate.com/upload/stock/20170322135245.jpg?v=1001)
เมื่อ Login ผิด
![PHP MySQL Login (mysqli) lock ban account PHP MySQL Login (mysqli) lock ban account](https://www.thaicreate.com/upload/stock/20170322135250.jpg?v=1001)
ใน Table จะมีการ Update จำนวนครั้งที่ Login ผิด
![PHP MySQL Login (mysqli) lock ban account PHP MySQL Login (mysqli) lock ban account](https://www.thaicreate.com/upload/stock/20170322135602.jpg?v=1001)
ในกรณีที่ Login ถูกต้อง
![PHP MySQL Login (mysqli) lock ban account PHP MySQL Login (mysqli) lock ban account](https://www.thaicreate.com/upload/stock/20170322135255.jpg?v=1001)
ในกรณีที่ login ไม่ถูกต้อง และเมื่อ Login เกินจำนวนครั้ง Account จะถูก Lock
![PHP MySQL Login (mysqli) lock ban account PHP MySQL Login (mysqli) lock ban account](https://www.thaicreate.com/upload/stock/20170322135302.jpg?v=1001)
ใน Table จะเห็นว่ามีสถานะ Update ว่าถูก Lock แล้ว
Example 2 PHP กับ MySQLi (Login) กำหนดเวลา Ban เช่น จะต้องรออีก 10 นาทีถึงจะ Login ได้อีกครั้ง
![PHP MySQL Login (mysqli) lock ban account PHP MySQL Login (mysqli) lock ban account](https://www.thaicreate.com/upload/stock/20170322140155.jpg?v=1001)
สร้างฟิวด์เก็บเวลาที่ถูก Ban
CREATE TABLE `member` (
`UserID` int(3) unsigned zerofill NOT NULL auto_increment,
`Username` varchar(20) NOT NULL,
`Password` varchar(20) NOT NULL,
`Name` varchar(100) NOT NULL,
`LoginCount` int(2) NOT NULL default '0',
`FlagLock` enum('Yes','No') NOT NULL default 'No',
`BanExpire` datetime NOT NULL,
PRIMARY KEY (`UserID`),
UNIQUE KEY `Username` (`Username`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
--
-- dump ตาราง `member`
--
INSERT INTO `member` VALUES (001, 'rut', 'rut123', 'Wisarut Nukitram', 0, 'No', '0000-00-00 00:00:00');
INSERT INTO `member` VALUES (002, 'chai', 'chai123', 'Surachai Sirisart', 0, 'No', '0000-00-00 00:00:00');
จากนั้นเขียน Code เพิ่มเป็นดังนี้
<?php
$LimitTime = 3;
$BanTime = 10; // Minute
session_start();
$serverName = "localhost";
$userName = "root";
$userPassword = "root";
$dbName = "mythaicreate";
$objCon = mysqli_connect($serverName,$userName,$userPassword,$dbName);
// Reset Ban
$strSQL = "UPDATE member SET LoginCount = 0 , FlagLock = 'No' WHERE BanExpire <= NOW() AND LoginCount = '".$LimitTime."' ";
$objQuery = mysqli_query($objCon,$strSQL);
// Check Login
$strSQL = "SELECT * FROM member WHERE Username = '".mysqli_real_escape_string($objCon,$_POST['txtUsername'])."' ";
$objQuery = mysqli_query($objCon,$strSQL);
$objResult = mysqli_fetch_array($objQuery,MYSQLI_ASSOC);
if(!$objResult)
{
echo "Not Found User!";
exit();
}
else
{
if($objResult["FlagLock"] == "Yes")
{
echo "This user account is lock!";
exit();
}
if($objResult["Password"] != $_POST["txtPassword"])
{
echo "Password Incorrect!";
// Update Login Failed
$strSQL = "UPDATE member SET LoginCount = LoginCount + 1 WHERE Username = '".mysqli_real_escape_string($objCon,$_POST['txtUsername'])."' ";
$objQuery = mysqli_query($objCon,$strSQL);
// If more than limit time auto lock account
if($objResult["LoginCount"] + 1 >= $LimitTime)
{
$strSQL = "UPDATE member SET FlagLock = 'Yes' , BanExpire = DATE_ADD(NOW(),INTERVAL $BanTime MINUTE) WHERE Username = '".mysqli_real_escape_string($objCon,$_POST['txtUsername'])."' ";
$objQuery = mysqli_query($objCon,$strSQL);
}
exit();
}
else
{
// Login Success
$_SESSION["UserID"] = $objResult["UserID"];
session_write_close();
// Reset LoginCount
$strSQL = "UPDATE member SET LoginCount = 0 WHERE Username = '".mysqli_real_escape_string($objCon,$_POST['txtUsername'])."' ";
$objQuery = mysqli_query($objCon,$strSQL);
header("location:user_page.php");
}
}
mysqli_close($objCon);
?>
![PHP MySQL Login (mysqli) lock ban account PHP MySQL Login (mysqli) lock ban account](https://www.thaicreate.com/upload/stock/20170322141118.jpg?v=1001)
เมื่อทดสอบ Login ผิดจะมีการกำหนดเวลาที่ถูก Ban ซึ่งในตัวอย่างกำหนดไว้ 10 นาที ซึ่งหลังจากผ่าน 10 นาทีจะถูกปลด Ban อัตโนมัติ
บทความที่เกี่ยวข้อง
Go to : PHP MySQL กับ Login Form ทำระบบ User ล็อกอิน แบบง่าย ๆ ด้วย PHP และ MySQL
Go to : PHP Authentication : การใช้งาน Authentication ตรวจสอบสถานะการ Login
Go to : PHP Session ($_SESSION,$HTTP_SESSION_VARS)
Go to : PHP MySQL : Connect to MySQL Database ภาษา PHP กับฐานข้อมูล MySQL
|
|
|
|
![](/images/point.jpg) |
|