php判断ip黑名单程序代码实例


Posted in PHP onFebruary 24, 2014

学校的新闻系统要求有些新闻只开放校内ip浏览,于是重写了一个代码来实现此功能,实现后的结果是,只要把允许访问的ip列入ip.txt这个文件中即可,同时支持c类ip,例如:

ip.txt
192.168
211.67.188
211.67.191.25
代码如下:

/*
* ip地址黑名单、白名单
* 判断访客地址的ip是否在ip.txt中,支持c类ip
* By xhat
*/
$ip = $_SERVER['REMOTE_ADDR'];
$ipArray = preg_replace("#rn?|n#","",file('ip.txt'));
foreach ($ipArray as $ipTest) {
if (substr_count($ip, $ipTest) != "0") {
echo "ok"; //执行相关命令
die();
}
}
?>

上面大家可以使用代码来骗过了,下面代码进行升级

<?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); 
} 
} 
?>

引用片段:

$oBlock_ip = new block_ip(); 
$oBlock_ip->checkIP();
PHP 相关文章推荐
PHP禁止页面缓存的代码
Oct 23 PHP
php中unlink()、mkdir()、rmdir()等方法的使用介绍
Dec 21 PHP
PHP中图片等比缩放的实例
Mar 24 PHP
PHP无限分类(树形类)的深入分析
Jun 02 PHP
php调用MySQL存储过程的方法集合(推荐)
Jul 03 PHP
浅谈Eclipse PDT调试PHP程序
Jun 09 PHP
PHP7.0版本备注
Jul 23 PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
May 31 PHP
Laravel中间件实现原理详解
Oct 09 PHP
php实现36进制与10进制转换功能示例
Jan 10 PHP
PHP用PDO如何封装简单易用的DB类详解
Jul 30 PHP
PHP命名空间与自动加载机制的基础介绍
Aug 25 PHP
thinkphp的c方法使用示例
Feb 24 #PHP
php根据操作系统转换文件名大小写的方法
Feb 24 #PHP
PHP获取本周第一天和最后一天示例代码
Feb 24 #PHP
thinkphp控制器调度使用示例
Feb 24 #PHP
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
Feb 24 #PHP
将php数组输出html表格的方法
Feb 24 #PHP
php格式化日期和时间格式化示例分享
Feb 24 #PHP
You might like
解析PHP对现有搜索引擎的调用
2013/06/25 PHP
PHP children()函数讲解
2019/02/03 PHP
PHP实现网站应用微信登录功能详解
2019/04/11 PHP
jquery 缓存问题的几个解决方法
2013/11/11 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
Node.js程序中的本地文件操作用法小结
2016/03/06 Javascript
JS组件Bootstrap Select2使用方法解析
2016/05/30 Javascript
jQuery实现ajax的叠加和停止(终止ajax请求)
2016/08/08 Javascript
利用Angularjs实现幻灯片效果
2016/09/07 Javascript
Vue实现动态响应数据变化
2017/04/28 Javascript
前端主流框架vue学习笔记第二篇
2017/07/26 Javascript
vue中for循环更改数据的实例代码(数据变化但页面数据未变)
2017/09/15 Javascript
vue.js中$set与数组更新方法
2018/03/08 Javascript
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
2018/05/17 Javascript
React Native开发封装Toast与加载Loading组件示例
2018/09/08 Javascript
使用Vue-Awesome-Swiper实现旋转叠加轮播效果&amp;平移轮播效果
2019/08/16 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
2020/08/10 Javascript
[42:24]完美世界DOTA2联赛循环赛 LBZS vs DM BO2第一场 11.01
2020/11/02 DOTA
python提示No module named images的解决方法
2014/09/29 Python
解决Python中由于logging模块误用导致的内存泄露
2015/04/23 Python
python中sys.argv参数用法实例分析
2015/05/20 Python
python urllib urlopen()对象方法/代理的补充说明
2017/06/29 Python
python中将zip压缩包转为gz.tar的方法
2018/10/18 Python
python Selenium实现付费音乐批量下载的实现方法
2019/01/24 Python
Python实现ATM系统
2020/02/17 Python
Python爬虫爬取、解析数据操作示例
2020/03/27 Python
HTML5 解决苹果手机不能自动播放音乐问题
2017/12/27 HTML / CSS
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
乔布斯斯坦福大学演讲稿
2014/05/23 职场文书
小学阳光体育活动总结
2014/07/05 职场文书
讲文明知礼仪演讲稿
2014/09/13 职场文书
党员示范岗材料
2014/12/19 职场文书
五年级学生评语大全
2014/12/26 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python
python Django框架快速入门教程(后台管理)
2021/07/21 Python
Nginx配置之禁止指定IP访问
2022/05/02 Servers