PHP技术

当前位置:首页 > PHP技术 >

PHP防止网站被攻击的应急代码

时间:2015-10-22        阅读:次        QQ群:182913345

        如果发现某个ip访问网站太频繁了就加入到黑名单禁止访问,这不是一个很好的办法,但只是情急之下应急的解决方式,只是权宜之计,以后再进行深入的研究一下。
 
这个方法总结为一句话就是:通过禁止IP频繁访问防止网站被攻击。

<?php
	header('Content-type: text/html; charset=utf-8');
	$ip=$_SERVER['REMOTE_ADDR'];//获取当前访问者的ip
	$logFilePath='./log/';//日志记录文件保存目录
	$fileht='.htaccess2';//被禁止的ip记录文件
	$allowtime=60;//防刷新时间
	$allownum=5;//防刷新次数
	$allowRefresh=120;//在允许刷新次数之后加入禁止ip文件中
  
	if(!file_exists($fileht)){
		file_put_contents($fileht,'');
	}
	
	$filehtarr=@file($fileht);
	if(in_array($ip."\r\n",$filehtarr)){
		exit('警告:你的IP已经被禁止了!');
	}
	
	//加入禁止ip
	$time=time();
	$fileforbid=$logFilePath.'forbidchk.dat';
	if(file_exists($fileforbid)){
	  if($time-filemtime($fileforbid)>30){
		@unlink($fileforbid);
	  }else{
		$fileforbidarr=@file($fileforbid);
		if($ip==substr($fileforbidarr[0],0,strlen($ip))){
		  if($time-substr($fileforbidarr[1],0,strlen($time))>120){
			@unlink($fileforbid);
		  }else if($fileforbidarr[2]>$allowRefresh){
			file_put_contents($fileht,$ip."\r\n",FILE_APPEND);
			@unlink($fileforbid);
		  }else{
			$fileforbidarr[2]++;
			file_put_contents($fileforbid,$fileforbidarr);
		  }
		}
	  }
	}
	
	//防刷新
	$str='';
	$file=$logFilePath.'ipdate.dat';
	if(!file_exists($logFilePath)&&!is_dir($logFilePath)){
	  mkdir($logFilePath,0777);
	}
	
	if(!file_exists($file)){
	  file_put_contents($file,'');
	}
	
	$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."\r\n";
		  }else if($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($logFilePath.'forbided_ip.log',$ip.'--'.date('Y-m-d H:i:s',time()).'--'.$uri."\r\n",FILE_APPEND);
			$timepass=$timetem+$allowtime-$time;
			exit('警告:不要刷新的太频繁!');
		  }
		}
	  }
	}
	
	if($yesno){
	  $str.=$checkip.$checkuri.$time."\r\n";
	}
	
	file_put_contents($file,$str); 

上一篇:提升PHP性能的15个要点

下一篇:PHP实现统计在线人数的方法

扫一扫,更多精彩内容推送

PHP技术分享

分享PHP技术,前端技术,数据库,SEO优化,服务器,网络安全等知识,是php程序员工作学习的好帮手!

Copyright © 2013-2015.PHP技术分享 www.php520.cn  版权所有  网站地图    PHP学习交流群

免责声明:网站内容收集于互联网,本网站不承担任何由于内容的合法性及健康性所引起的争议和法律责任。

欢迎大家对网站内容侵犯版权等不合法和不健康行为进行监督和举报。 沪ICP备15014499号-2