php下网站防IP攻击代码,超级实用
2015-01-24信息快讯网
现在做外国网络,访问量越来越高了,最近有很多不良IP不停的进行攻击,由于不是自己的主机,所以,只能通过代码去阻止它们。
今天我开发了下面的代码,算是大功初成,一天拦截了15个IP,服务器负载正常。
<?php
//查询禁止IP
$ip =$_SERVER['REMOTE_ADDR'];
$fileht=".htaccess2";
if(!file_exists($fileht))file_put_contents($fileht,"");
$filehtarr=@file($fileht);
if(in_array($ip."\r\n",$filehtarr))die("Warning:"."<br>"."Your IP address are forbided by some reason, IF you have any question Pls emill to [email protected]!");
//加入禁止IP
$time=time();
$fileforbid="log/forbidchk.dat";
if(file_exists($fileforbid))
{ if($time-filemtime($fileforbid)>60)unlink($fileforbid);
else{
$fileforbidarr=@file($fileforbid);
if($ip==substr($fileforbidarr[0],0,strlen($ip)))
{
if($time-substr($fileforbidarr[1],0,strlen($time))>600)unlink($fileforbid);
elseif($fileforbidarr[2]>600){file_put_contents($fileht,$ip."\r\n",FILE_APPEND);unlink($fileforbid);}
else{$fileforbidarr[2]++;file_put_contents($fileforbid,$fileforbidarr);}
}
}
}
//防刷新
$str="";
$file="log/ipdate.dat";
if(!file_exists("log")&&!is_dir("log"))mkdir("log",0777);
if(!file_exists($file))file_put_contents($file,"");
$allowTime = 120;//防刷新时间
$allowNum=10;//防刷新次数
$uri=$_SERVER['REQUEST_URI'];
$checkip=md5($ip);
$checkuri=md5($uri);
$yesno=true;
$ipdate=@file($file);
foreach($ipdate as $k=>$v)
{ $iptem=substr($v,0,32);
$uritem=substr($v,32,32);
$timetem=substr($v,64,10);
$numtem=substr($v,74);
if($time-$timetem<$allowTime){
if($iptem!=$checkip)$str.=$v;
else{
$yesno=false;
if($uritem!=$checkuri)$str.=$iptem.$checkuri.$time."1\r\n";
elseif($numtem<$allowNum)$str.=$iptem.$uritem.$timetem.($numtem+1)."\r\n";
else
{
if(!file_exists($fileforbid)){$addforbidarr=array($ip."\r\n",time()."\r\n",1);file_put_contents($fileforbid,$addforbidarr);}
file_put_contents("log/forbided_ip.log",$ip."--".date("Y-m-d H:i:s",time())."--".$uri."\r\n",FILE_APPEND);
$timepass=$timetem+$allowTime-$time;
die("Warning:"."<br>"."Sorry,you are forbided by refreshing frequently too much, Pls wait for ".$timepass." seconds to continue!");
}
}
}
}
if($yesno) $str.=$checkip.$checkuri.$time."1\r\n";
file_put_contents($file,$str);
?>
把程序include进要进行的php文件头部。
程序首先判断IP是否在禁止列表,如果在则退出;
否则,如果IP在监控列表,10分钟内点击超过600次则加入禁止列表。
如果没有超过时间和次数则次数加1,同时,监控IP是否对同一页面频繁操作。
由于是机器刷频,所以程序不用session判断。
还有就是更新的时候,不能用独占处理文件。
使用伪静态存储IP也会出错。
这个程序还有变化和改进的余地的,大家也可以参考QQ农场里的降级原理,基本上农场也是按照这个原理开发的吧。
php&mysql 日期操作小记
php explode函数实例代码
PHP中获取文件扩展名的N种方法小结
PHP中的正则表达式函数介绍
支持中文字母数字、自定义字体php验证码代码
php tp验证表单与自动填充函数代码
php模拟post行为代码总结(POST方式不是绝对安全)
PHP中运用jQuery的Ajax跨域调用实现代码
php中用于检测一个地理IP地址是否可用的代码
PHP 中检查或过滤IP地址的实现代码
php数组函数序列之array_flip() 将数组键名与值对调
php中获取远程客户端的真实ip地址的方法
PHP 数据结构 算法 三元组 Triplet
PHP 分页类代码(简单好用型)第1/2页
php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
php park、unpark、ord 函数使用方法(二进制流接口应用实例)
php通过文件头检测文件类型通用代码类(zip,rar等)
php empty,isset,is_null判断比较(差异与异同)
学习php笔记 字符串处理
PHP类中Static方法效率测试代码
php中去除所有js,html,css代码
PHP 显示客户端IP与服务器IP的代码
php采集时被封ip的解决方法
为IP查询添加GOOGLE地图功能的代码
在PHP中实现Javascript的escape()函数代码