في الأصل، تمت كتابة العديد من الوظائف، وتم تسجيل القائمة السوداء لـ IP في المكتبة، ولتسهيل الفهم، تم تغييرها إلى فئة لكتابة القائمة السوداء لـ IP.
192.168.1.1 عنوان IP واحد
192.168.1.* هذا الوكيل 192.168.1.1-192.168.1-255
192.158.1.2-20 تعني 192.158.1.2-192.158.1.20
يمكنك أيضًا كتابة 192.168.1.[1|2|3]
هيهي ~ لا أعرف ما إذا كانت الفكرة شاملة أم لا، لذلك سأطرحها للمناقشة وسأستخدم الاقتباسات التالية:
$oBlock_ip = new block_ip();
$oBlock_ip->checkIP();
ما يلي هو جزء مقتبس:
<?php
فئة block_ip {
var $Block_ip = array("192.168.1.1"، "210.10.2.1-20"، "222.34.4.*")؛
وظيفة __ بناء () {
}
وظيفة __تدمير(){
}
وظيفة خاصة makePregIP($str){
إذا (strstr($str،"-")) {
$aIP = تنفجر("."،$str);
foreach ($aIP كـ $k=>$v) {
إذا (!strstr($v،"-")) {
$preg_limit .= makePregIP($v);
} آخر{
$aipNum = تنفجر("-",$v);
for($i=$aipNum[0];$i<=$aipNum[1];$i++){
$preg .=$preg؟"|".$i:"[".$i;
}
$preg_limit .=strrpos($preg_limit,".",1)==(strlen($preg_limit)-1)?$preg."]":":".".$preg."]";
}
}
}آخر{
$preg_limit .= $str.";
}
إرجاع $preg_limit؛
}
وظيفة خاصة getAllBlockIP(){
إذا ($هذا->Block_ip) {
foreach ($this->Block_ip كـ $k=>$v) {
$ipaddres = $this->makePregIP($v->start_ip);
$ip = str_ireplace("."،.",$ipaddres);
$ip = str_replace("*"،[0-9]{1,3}"،$ip);
$ipaddres = "/".$ip."/";
$ip_list[] = $ipaddres;
}
}
إرجاع $ip_list;
}
الوظيفة العامة checkIP () {
$iptable = $this->getAllBlockIP();
$IsJoined = true;
// احصل على IP المستخدم
$Ip = $this->get_client_ip();
$Ip = تقليم($Ip);
// قم بإزالة شرائح IP من القائمة السوداء
إذا (iptable) {
foreach($iptable كقيمة $) {
إذا (preg_match("{$value}"،$Ip)) {
$IsJoined = false;
استراحة؛
}
}
}
// إذا كان مدرجًا في القائمة السوداء لعناوين IP، فقم بإجراء العمليات التالية
إذا(!$IsJoined){
صدى "خطأ IP"؛
مخرج؛
}
}
وظيفة خاصة get_client_ip(){
إذا (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "غير معروف"))
$ip = getenv("HTTP_CLIENT_IP");
وإلا إذا (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "غير معروف"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
وإلا إذا (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "غير معروف"))
$ip = getenv("REMOTE_ADDR");
وإلا إذا (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "غير معروف"))
$ip = $_SERVER['REMOTE_ADDR'];
آخر
$ip = "غير معروف";
العودة($ip);
}
}
?>