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 相关文章推荐
Blitz templates 最快的PHP模板引擎
Apr 06 PHP
php文档更新介绍
Jul 22 PHP
PHP不用递归实现无限分级的例子分享
Apr 18 PHP
php通过ajax实现双击table修改内容
Apr 28 PHP
PHP+ajax分页实例简析
Dec 07 PHP
Symfony2框架学习笔记之表单用法详解
Mar 18 PHP
Zend Framework基本页面布局分析
Mar 19 PHP
Zend Framework开发入门经典教程
Mar 23 PHP
PHP第三方登录―QQ登录实现方法
Feb 06 PHP
Laravel中log无法写入问题的解决
Jun 17 PHP
php微信公众号开发之秒杀
Oct 20 PHP
thinkPHP3.2使用RBAC实现权限管理的实现
Aug 27 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函数 serialize()和unserialize()
2012/02/04 PHP
PHP获取input输入框中的值去数据库比较显示出来
2016/11/16 PHP
PHP实现根据数组的值进行分组的方法
2017/04/20 PHP
PHP实现提取多维数组指定一列的方法总结
2019/12/04 PHP
建立良好体验度的Web注册系统ajax
2007/07/09 Javascript
javascript实现的网页局布刷新效果
2008/12/01 Javascript
Jquery之美中不足小结
2011/02/16 Javascript
JQuery实现鼠标滑过显示导航下拉列表
2013/09/12 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
2014/05/02 Javascript
node.js中的path.join方法使用说明
2014/12/08 Javascript
css如何让浮动元素水平居中
2015/08/07 Javascript
jQuery图片前后对比插件beforeAfter用法示例【附demo源码下载】
2016/09/20 Javascript
headjs实现网站并行加载但顺序执行JS
2016/11/29 Javascript
JavaScript简单验证表单空值及邮箱格式的方法
2017/01/20 Javascript
JS利用cookies设置每隔24小时弹出框
2017/04/20 Javascript
vue配置请求本地json数据的方法
2018/04/11 Javascript
Vue使用vux-ui自定义表单验证遇到的问题及解决方法
2018/05/10 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
2018/05/15 Javascript
JavaScript函数式编程(Functional Programming)箭头函数(Arrow functions)用法分析
2019/05/22 Javascript
JS数组中对象去重操作示例
2019/06/04 Javascript
easyUI使用分页过滤器对数据进行分页操作实例分析
2020/06/01 Javascript
python编程实现归并排序
2017/04/14 Python
详解Python安装scrapy的正确姿势
2018/06/26 Python
django orm 通过related_name反向查询的方法
2018/12/15 Python
Python更换pip源方法过程解析
2020/05/19 Python
django queryset 去重 .distinct()说明
2020/05/19 Python
浅谈keras中的keras.utils.to_categorical用法
2020/07/02 Python
css3实例教程 一款纯css3实现的环形导航菜单
2014/10/20 HTML / CSS
基于html和CSS3制作酷炫的导航栏
2015/09/23 HTML / CSS
CSS3中新增的对文本和字体的设置
2020/02/03 HTML / CSS
我爱读书演讲稿
2014/05/07 职场文书
软件研发工程师岗位职责
2014/09/30 职场文书
中秋节寄语2015
2015/03/24 职场文书
实验室安全管理制度
2015/08/05 职场文书
七年级思品教学反思
2016/02/20 职场文书
vue递归实现树形组件
2022/07/15 Vue.js