แนวทางการบล็อค IP ด้วยไฟล์ พร้อมตั้งเวลายกเลิกการบล็อค อย่างง่าย

เขียนเมื่อ 7 ปีก่อน โดย Ninenik Narkdee
เขียนไฟล์ block ip

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ เขียนไฟล์ block ip

ดูแล้ว 5,936 ครั้ง


แนวทางคือให้เราแยกไฟล์ออกเป็นสองไฟล์ 
ไฟล์แรก เก็บเวลาของ IP ที่จะบล็อค เวลาที่เก็บในรูปแบบ 2017-04-18 10:00:00
ไฟล์ที่สอง เก็บ IP ที่จะบล็อค
 

ฟังก์ชั่นนี้ในการส่งค่า IP

สมมติไฟล์แรกชื่อ timeIP.txt ไฟล์ทีสองชื่อ blockIP.txt
เราสามารถใช้ฟังก์ชั่นนี้ในการส่งค่า IP ที่ต้องการบล็อคไปบันทึกในไฟล์ blockIP.txt ได้
พร้อมกับสร้างเวลาที่บันทึก IP นั้นด้วย ได้ดังนี้
 
<?php
function setBlockIP($IP){
	$dateTime = date("Y-m-d H:i:s");
	$file = "timeIP.txt"; 
	$fileTime = fopen($file, "a"); 
	$dateTime = "$dateTime\r\n";
	fwrite($fileTime, $dateTime); 
	fclose($fileTime); 
	
	$dataIP = trim($IP);
	$file = "blockIP.txt"; 
	$fileIP = fopen($file, "a"); 
	$dataIP = "$dataIP\r\n";
	fwrite($fileIP, $dataIP); 
	fclose($fileIP); 
}
?>
 
เวลาใช้งาน เช่น ต้องการบล็อค IP 222.222.222.222
เราก็ใช้คำสั่ง
 
<?php
setBlockIP('222.222.222.222');
?>
 
เราจะได้ไฟล์ timeIP.txt เป็นดังนี้
 
2017-04-19 05:47:47
 
และได้ไฟล์ blockIP เป็นดังนี้
 
222.222.222.222
 
และทุกครั้งที่เราส่งค่า IP ไปบันทึกข้อมูลก็จะบันทึกทั้งสองไฟล์ แต่ละบรรทัดลงมาเรื่อยๆ
 

ตัวอย่างไฟล์ และโค้ดการส่งค่า IP ที่ต้องการบล็อคไปบันทึก

 
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Document</title>
</head>

<body>

<?php
function setBlockIP($IP){
	$dateTime = date("Y-m-d H:i:s");
	$file = "timeIP.txt"; 
	$fileTime = fopen($file, "a"); 
	$dateTime = "$dateTime\r\n";
	fwrite($fileTime, $dateTime); 
	fclose($fileTime); 
	
	$dataIP = trim($IP);
	$file = "blockIP.txt"; 
	$fileIP = fopen($file, "a"); 
	$dataIP = "$dataIP\r\n";
	fwrite($fileIP, $dataIP); 
	fclose($fileIP); 
}
?>
<?php
if(isset($_POST['btn_block']) && $_POST['IP']!=""){
	setBlockIP($_POST['IP']);
}
?>

<form name="form1" method="post" action="">
  <input type="text" name="IP" id="IP">
  <input type="submit" name="btn_block" id="btn_block" value="Block this IP">
</form>

</body>
</html>


 
 

ตรวจสอบและแจ้งการบล็อค IP

ในส่วนของไฟล์ หรือโค้ดที่จะนำไปเช็ค ให้ใช้เป็นดังนี้
 
<?php
function diff2time($time_a,$time_b){
    $now_time1=$time_b;
    $now_time2=$time_a;
    $time_diff=abs($now_time2-$now_time1);
    $time_diff_h=floor($time_diff/3600); // จำนวนชั่วโมงที่ต่างกัน
    $time_diff_m=floor(($time_diff%3600)/60); // จำวนวนนาทีที่ต่างกัน
    $time_diff_s=($time_diff%3600)%60; // จำนวนวินาทีที่ต่างกัน
	$str_remain_time = "";
	$str_remain_time.=($time_diff_h>0)?$time_diff_h." ชั่วโมง ":"";
	$str_remain_time.=($time_diff_m>0)?$time_diff_m." นาที ":"";
	$str_remain_time.=($time_diff_s>0)?$time_diff_s." วินาที ":"";
    return $str_remain_time;
}
$timeIP=file("timeIP.txt");    
if($timeIP){
	foreach($timeIP as $k=>$v){
		$timeIP[$k]=trim($v);	
	}
}
$blockIP=file("blockIP.txt");   
if($blockIP){
	foreach($blockIP as $k=>$v){
		$blockIP[$k]=trim($v);	
	}
}
$visitorIP = $_SERVER['REMOTE_ADDR']; 
$blockStat = array_search($visitorIP,$blockIP);
if($blockStat !== false)
{
	$timeExpire = strtotime($timeIP[$blockStat]." +30 minute");
	if(time()<$timeExpire){
		$strTimeRemain = diff2time($timeExpire,time());
		echo "IP ของคุณถูกบล็อก<br>"; 
		echo "ไอพี ของคุณ จะใช่งานไดีอีกครั้งใน อีก ".$strTimeRemain;
		exit;
	}
}
?>
 
ในโค้ดวิธีการทำงาน อ่านค่า IP กับ เวลา จากทั้งสองไฟล์ที่เราบันทึกด้วยคำสั่ง file()
เราจะได้ค่าของข้อมูลทั้งสองในรูปแบบ array มี key เป้น 0,1,2,.... มีจำนวนบรรทัดตามข้อมูล
ได้ที่บันทึก  ด้วยค่า key ของทั้งสองไฟล์จะสัมพันธ์กัน คือ เวลาของบรรทัดที่ x เป็นเวลาของ IP บรรทัดที่ x
แต่ก่อนจะเอาค่าไปใช้ เราต้องการ trim() หรือตัดช่องว่างซ้ายขวาของข้อมูล หรือจัดข้อมูล array ใหม่ก่อน
เพราะอาจจะติดส่วนของการขึ้นบรรทัดใหม่จากการใช้ คำสั่ง \r\n ตอนเพิ่มข้อมูล
 
จากนั้น ให้เราทำการดึงข้อมูล IP ของผู้ใช้มาไว้ในตัวแปร $visitorIP แล้วเอาไปค้นหาใน array 
ของ IP ที่ถูกบล็อค ด้วยคำสั่ง
 
$blockStat = array_search($visitorIP,$blockIP);
 
ซึ่งถ้า IP ของผู้ใช้ขณะน้้น มีอยู่ในรายการที่ถูกบล็อค ก็จะคืนค่าเป็น key หรือบรรทัดที่ มี IP ที่ตรง
ค่าจะถูกเก็บในตัวแปร $blockStat สมมติเช่น $blockStat ตรงกันที่บรรทัดที่ 2 หรือ key = 1
เราก็เอาค่า key ที่ได้ไปหาค่าเวลาของ key นั้น ผ่านการอ้างอิงตัวแปร
 
$timeIP[$blockStat] ก็ได้เวลาของ IP ที่เริ่มบันทึก
 
จากนั้น แปลงเวลาให้อยู่ในรูปแบบตัวเลข หรือที่เรียกว่า timestamp เพื่อใช้ในการเทียบค่า มากกว่า น้อยกว่า
ด้วยคำสั่ง
 
$timeExpire = strtotime($timeIP[$blockStat]." +30 minute");
 
จากโค้ดในตัวอย่างเราบวกเวลาเพิ่มไป 30 นาที เพื่อเป็นการกำหนดว่า เวลาเริ่มต้นบวกอีก 30 นาที
คือเวลาสิ้นสุดการบล็อค เราอาจจะเปลี่ยนเป็นบวกค่าอื่นแทนได้ ตามต้องการ
 
เมื่อเราได้ $timeExpire ซึ่งเป้นเวลาที่การบล็อค IP จะหมดอายุ เราก็เอาค่าเวลานี้ ไปเทียบกับเวลาปัจจุบัน
 
คำสั่ง time() คือ timestamp ของเวลาปัจจุบัน
 
if(time()<$timeExpire){
	$strTimeRemain = diff2time($timeExpire,time());
	echo "IP ของคุณถูกบล็อก<br>"; 
	echo "ไอพี ของคุณ จะใช่งานไดีอีกครั้งใน อีก ".$strTimeRemain;
	exit;
}
 
ถ้าเวลาในตอนนี้ ยังไม่ถึงเวลาสิ้นสุดการบล็อค ก็ให้เข้าไปในส่วนแจ้งว่ายังบล็อคอยู่
 
ในส่วนของการบล็อคเราใช้ฟังก์ชั่น diff2time() ส่งค่าเวลาปัจจุบัน กับเวลาสิ้นสุดเข้าไป
เพื่อหาว่าเหลือเวลาที่บล็อคอยู่อีกกี่ชั่วโมง กี่นาที กี่วินาที แล้วเอาค่านั้นมาแสดงแจ้ง
ทางหน้าจอ ในลักษณะ ดังนี้
 
IP ของคุณถูกบล็อก
ไอพี ของคุณ จะใช่งานไดีอีกครั้งใน อีก 29 นาที 55 วินาที
 
 
เราสามารถเอาแนวทางนี้ไปประยุกต์เพิ่มเติมได้ อย่างไรก็ตามหากนำไปใช้บน server ต้องกำหนด permission ให้ไฟล์
นั้นๆ เป็น 777 เพื่อให้สามารถเขียนไฟล์นั้นได้ 
หรือสามารถใช้ข้อมูลจากฐานข้อมูล แทนการใช้งานจากไฟล์ ก็สามารถทำได้เหมือนกัน โดยสิ่งที่ต้องการ คือ ชุดข้อมูลของ
เวลา และชุดข้อมูลของ IP ที่ทำการบล็อค

 


   เพิ่มเติมเนื้อหา ครั้งที่ 1 วันที่ 19-04-2017


เนื้อหาส่วนต่อไปนี้ เป็นส่วนของการปรับแต่งเพิ่มเติม รูปแบบจากดัดแปลงจากโค้ด้านบน
สามารถดูประกอบกันได้ หรือใช้รูปแบบใหม่ก็ได้
 
รูปแบบใหม่ จะรองรับการรีเซ็ตค่า ip ที่ถูกยกเลิกการบล็อคตามเวลาที่ระบุไว้แล้ว
อย่างไรก็ตาม การใช้การเขียนไฟล์ในการระบุ IP เพื่อบล็อคยังไม่ใช่วิธีที่เหมาะสม เพราะ
การอ่านไขไฟล์พร้อมๆ กัน อาจจะเกิดข้อผลพลาดขึ้นได้ ส่วนให้นี้ลองนำไปใช้และติดตามผลกันดู
 
 
เพื่อให้การเรียกใช้ส่วนที่เกี่ยวข้องได้ง่าย เราจะรวมฟังก์ชั่นไว้ในไฟล์
ที่ชื่อ blockip_func.php ในไฟล์จะประกอบด้วย
- ฟังก์ชั่น reset ค่า ลบ ip และเวลา ออกจากไฟล์  
- ฟังก์ชั่นสำหรับเพิ่ม ip และเวลา ที่ต้องการบล็อค 
- ฟังก์ชั่นหาช่วงเวลา ที่การบล็อคจะหมดอายุ
 

ไฟล์ blockip_func.php 

<?php
function resetblockIP($dataIP,$dataTIME){
	$readingIP = fopen('blockIP.txt', 'r');
	$writingIP = fopen('blockIP.txt.tmp', 'w');
	$readingTIME = fopen('timeIP.txt', 'r');
	$writingTIME = fopen('timeIP.txt.tmp', 'w');
	
	$replacedIP = false;
	$replacedTIME = false;

	while(!feof($readingIP)) {
	  $lineIP = fgets($readingIP);
	  if(stristr($lineIP,$dataIP)) {
		$lineIP = "";
		$replacedIP = true;
	  }
	  fputs($writingIP, $lineIP);
	}
	while(!feof($readingTIME)) {
	  $lineTIME = fgets($readingTIME);
	  if(stristr($lineTIME,$dataTIME)) {
		$lineTIME = "";
		$replacedTIME = true;
	  }
	  fputs($writingTIME, $lineTIME);
	}	
	fclose($readingIP); fclose($writingIP);
	fclose($readingTIME); fclose($writingTIME);

	if($replacedIP){
		unlink('blockIP.txt');
		rename('blockIP.txt.tmp', 'blockIP.txt');
	}
	if($replacedTIME){
		unlink('timeIP.txt');
		rename('timeIP.txt.tmp', 'timeIP.txt');
	}
}
function diff2time($time_a,$time_b){
    $now_time1=$time_b;
    $now_time2=$time_a;
    $time_diff=abs($now_time2-$now_time1);
    $time_diff_h=floor($time_diff/3600); // จำนวนชั่วโมงที่ต่างกัน
    $time_diff_m=floor(($time_diff%3600)/60); // จำวนวนนาทีที่ต่างกัน
    $time_diff_s=($time_diff%3600)%60; // จำนวนวินาทีที่ต่างกัน
    $str_remain_time = "";
    $str_remain_time.=($time_diff_h>0)?$time_diff_h." ชั่วโมง ":"";
    $str_remain_time.=($time_diff_m>0)?$time_diff_m." นาที ":"";
    $str_remain_time.=($time_diff_s>0)?$time_diff_s." วินาที ":"";
    return $str_remain_time;
}
// ฟังก์ช่ันสำหรับกำหนด IP และเวลา IP
function setBlockIP($IP){
    $dateTime = date("Y-m-d H:i:s");
    $file = "timeIP.txt"; 
    $fileTime = fopen($file, "a"); 
    $dateTime = "$dateTime\r\n";
    fwrite($fileTime, $dateTime); 
    fclose($fileTime); 
     
    $dataIP = trim($IP);
    $file = "blockIP.txt"; 
    $fileIP = fopen($file, "a"); 
    $dataIP = "$dataIP\r\n";
    fwrite($fileIP, $dataIP); 
    fclose($fileIP); 
}
?>
 

ไฟล์สำหรับบันทึก และการจัดการ ip และ เวลา สมมติให้ชื่อว่า demo_001.php

<?php
require_once("blockip_func.php");
?>
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Document</title>
    <link rel="stylesheet" href="https://unpkg.com/bootstrap@3.3.7/dist/css/bootstrap.min.css">
</head>
<body>
 


<?php
if(isset($_POST['btn_block']) && $_POST['IP']!=""){
    setBlockIP($_POST['IP']);
}
?>
<?php
if(isset($_POST['deleteIP'])){
	resetblockIP($_POST['deleteIP'],$_POST['deleteTIME']);
}
?>
<br>
<br>
 <div class="container" style="width:500px;">
<form name="form1" method="post" action="">
  <input type="text" name="IP" id="IP">
  <input type="submit" name="btn_block" id="btn_block" value="Block this IP"> 
  <a href="demo_002.php">demo_002.php </a>
</form>
</div>
<br>
<?php
$fileTIME="timeIP.txt";
if(file_exists($fileTIME)){
	$timeIP=file($fileTIME);   
}
if(isset($timeIP)){
    foreach($timeIP as $k=>$v){
        $timeIP[$k]=trim($v);  
    }
}
$fileIP="blockIP.txt";
if(file_exists($fileIP)){
	$blockIP=file($fileIP);   
}
if(isset($blockIP)){
    foreach($blockIP as $k=>$v){
        $blockIP[$k]=trim($v);  
    }
}
?>
<div class="container" style="width:600px;">
<table class="table table-bordered">
    <tr>
        <th>IP</th>
        <th>Block Time</th>
        <th>Block expired</th>
        <th>Status</th>
        <th>Delete</th>
    </tr>
<?php if(isset($blockIP)){ ?>    
	<?php foreach($blockIP as $k=>$valueIP){ ?>
    <?php
	$msgStatus="";
	$timeExpire = strtotime($timeIP[$k]." +1 minute");	
	if(time()<$timeExpire){
		$strTimeRemain = diff2time($timeExpire,time());
		$msgStatus = "Blocked";
	}else{
		resetblockIP($valueIP,$timeIP[$k]);		
		$strTimeRemain = "-";
		$msgStatus =  "Allowed";
	}	
	?>
    <tr>
        <td><?=$valueIP?></td>
        <td><?=$timeIP[$k]?></td>
        <td><?=$strTimeRemain?></td>
        <td><?=$msgStatus?></td>
        <td>
        <form action="" method="post">
        <input type="hidden" name="deleteIP" value="<?=$valueIP?>" />
        <input type="hidden" name="deleteTIME" value="<?=$timeIP[$k]?>" />        
        <button type="submit" class="btn btn-danger btn-xs">Delete</button>
        </form>
        </td>
    </tr>
    <?php } ?>
<?php } ?>    
</table>
 </div>
 
</body>
</html>
 

ไฟล์เรียกใช้การตรวจสอบการบล็อค IP สมมติเรากำหนดชื่อ demo_002.php

 
<?php
require_once("blockip_func.php");
?>
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Document</title>
    <link rel="stylesheet" href="https://unpkg.com/bootstrap@3.3.7/dist/css/bootstrap.min.css">
</head>
<body>
 
<body>

<br>
<br>

<div class="container" style="width:500px;">
<?php
$fileTIME="timeIP.txt";
if(file_exists($fileTIME)){
	$timeIP=file($fileTIME);   
}
if(isset($timeIP)){
    foreach($timeIP as $k=>$v){
        $timeIP[$k]=trim($v);   
    }
}
$fileIP="blockIP.txt";
if(file_exists($fileIP)){
	$blockIP=file($fileIP);   
}
if(isset($blockIP)){
    foreach($blockIP as $k=>$v){
        $blockIP[$k]=trim($v);  
    }
}
$visitorIP = $_SERVER['REMOTE_ADDR']; 
if(isset($blockIP)){
	$blockStat = array_search($visitorIP,$blockIP);
	if($blockStat !== false)
	{
		$timeExpire = strtotime($timeIP[$blockStat]." +1 minute");
		if(time()<$timeExpire){
			$strTimeRemain = diff2time($timeExpire,time());
			echo "IP ของคุณถูกบล็อก<br>"; 
			echo "ไอพี ของคุณ จะใช่งานไดีอีกครั้งใน อีก ".$strTimeRemain;
			exit;
		}else{
			resetblockIP($visitorIP,$timeIP[$blockStat]);		
		}
	}
}
?>
<a href="demo_001.php">demo_001.php </a>
</div>
 <br>

</body>
</html>
 
ลดดูหน้าตาจัดการไฟล์ demo_001.php เมื่อมีการเพิ่มข้อมูล ตัวอย่างลงไป 
 
 
เมื่อ IP แรกหมดเวลาการบล็อค จะถูกลบอัตโนมัติ แต่ยังแสดงครั้งแรกหนึ่งครั้ง
 
 
เมื่อโหลดหน้านี้อีกครั้ง รายการ หายไปแล้ว
 
 
IP ที่หมดอายุจะลบออกเองอัตโนมัติเมื่อถึงเวลา และเราโหลดหน้านี้อีกครั้ง
เราสามารถลบ รายการ IP ที่ยังไม่หมดเวลาออกได้

 


กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ








เนื้อหาพิเศษ เฉพาะสำหรับสมาชิก

กรุณาล็อกอิน เพื่ออ่านเนื้อหาบทความ

ยังไม่เป็นสมาชิก

สมาชิกล็อกอิน



( หรือ เข้าใช้งานผ่าน Social Login )




URL สำหรับอ้างอิง





คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )







เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ