对IP及IP段进行访问限制

news/2024/7/4 8:08:59

本来是写了几个函数,IP黑名单是记到库里的,为了方便理解,改成了一个class把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
class block_ip {
var $Block_ip = array("192.168.1.1","210.10.2.1-20","222.34.4.*");

function __construct(){

}

function __destruct(){

}

private function makePregIP($str){
if (strstr($str,"-")) {
$aIP = explode(".",$str);
foreach ($aIP as $k=>$v) {
if (!strstr($v,"-")) {
$preg_limit .= makePregIP($v);
} else{
$aipNum = explode("-",$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."]";
}
}
}else{
$preg_limit .= $str.".";
}
return $preg_limit;
}

private function getAllBlockIP(){
if ($this->Block_ip) {
foreach ($this->Block_ip as $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;
}
}
return $ip_list;
}

public function checkIP() {
$iptable = $this->getAllBlockIP();
$IsJoined = true;
//取得用户ip
$Ip = $this->get_client_ip();
$Ip = trim($Ip);
//剔除黑名单中的IP区段
if ($iptable) {
foreach($iptable as $value) {
if (preg_match("{$value}",$Ip)) {
$IsJoined = false;
break;
}
}
}
//如果在ip黑名单中就执行如下操作
if( !$IsJoined ){
echo "IP Error";
exit;
}
}

private function get_client_ip(){
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
$ip = getenv("HTTP_CLIENT_IP");
else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
$ip = getenv("REMOTE_ADDR");
else if (isset($_SERVER[’REMOTE_ADDR’]) && $_SERVER[’REMOTE_ADDR’] && strcasecmp($_SERVER[’REMOTE_ADDR’], "unknown"))
$ip = $_SERVER[’REMOTE_ADDR’];
else
$ip = "unknown";
return($ip);
}

}
?>


http://www.niftyadmin.cn/n/2404686.html

相关文章

弹性盒中 flex详解及flex:1的用法解析

弹性盒中 flex详解及flex&#xff1a;1的用法解析 一、flex 在了解 flex&#xff1a;1 之前我们先了解一下flex的属性值有哪些&#xff0c;就如同background一样&#xff0c;有着backgournd-images、background-color、background-position等属性名一样&#xff0c; flex也有…

JavaScript:自增和自减

JavaScript&#xff1a;自增和自减 我一直以为我已经搞明白了自增和自减&#xff0c;直到有一次遇到一道题&#xff0c;我才发现我对于自增和自减并没有完全掌握。 来看看下面这道题&#xff1a; var a 2;console.log(a a a a --a a-- a);你知道答案是多少吗&#xff1f;&a…

c# XML序列化与反序列化

原先一直用BinaryFormatter来序列化挺好&#xff0c;可是最近发现在WinCE下是没有办法进行BinaryFormatter操作&#xff0c;很不爽&#xff0c;只能改成了BinaryWriter和BinaryReader来读写&#xff0c;突然想到能不能用XML来序列化&#xff1f;于是在网上查了些资料便写了些实…

清晰易懂的了解JavaScript中的数据类型转换

清晰易懂的了解JavaScript中的数据类型转换 一、判断数据类型的两种方法&#xff1a; 1、 typeof (检测的数据) ​ var a "hello world";var b 6.5;// 检测a的数据类型console.log(typeof(a)); //string//检测a&#xff0c;b的数据类型console.log(typeof(a…

JavaScript:计算两个数之间奇数的个数

JavaScript&#xff1a;计算两个数之间有几个奇数 给你两个非负整数low和high&#xff0c;其中0 < low < high < 10^9, 请返回两个数之间&#xff08;包括二者&#xff09;奇数的 个数 /*** param {number} low* param {number} high* return {number}*/ var countO…

mssql自动备份及自动清除日志文件教程

1、每日自动备份 强烈建议有条件的用户进行此操作&#xff01; 1、打开企业管理器&#xff0c;在控制台根目录中依次点开Microsoft SQL Server--SQL Server组--双击打开你的服务器 2、然后点上面菜单中的工具--选择数据库维护计划器 3、下一步选择要进行自动备份的数据--下一步…

JavaScript:打印一个等腰三角形

JavaScript&#xff1a;打印一个等腰三角形 for(var i1; i<10; i){for(var j10;j>i;j--){document.write(" "); //打印一个空格&#xff08;占位&#xff09;}for(var k1; k<i; k){document.write("a");}document.write("<br>")…

如何快速的切换状态

移动办公是现代社会的趋势&#xff0c;利用笔记本计算机的网卡接口连入区域网络&#xff0c;马上就可以进入工作状态。但是每个区域网络的设定是不相同的&#xff0c;例如IP地址、通讯闸等等&#xff0c;那么每到一个新的区域网络中&#xff0c;你就需要重新进行设定&#xff0…