駭客攻防 – DDoS的 CC 攻擊阻擋

昨天滑Facebook看到 WordPress 社群中有人提出他的網站服務正在遭受阻斷服務攻擊(DDoS),這是一種藉由大量請求,導致伺服器效能緊繃無法服務正常人的一種攻擊手法。

CC 攻擊的手法說白了就是躲在代理伺服器(Proxy)後面來發送請求,因為代理伺服器的list不少,請求的資源也廣(尤其針對內容農場這類網站),這樣使得 hacker 的 pattern 難以確認,無法針對攻擊做黑名單組檔。

那怎辦哩~

省錢版

其實答案在第一段就出現了XD 那就是只給正常人服務阿! 註冊時常見的CAPTCHA驗證碼就是一種機制,但每個瀏覽都要先掛上這功能根本擾民,還不如把系統給關了。

所以用只有正常人瀏覽情境下才會產生的資料來做驗證,說穿了就是在前端瀏覽器與使用者執行互動下的產物-> Cookie

建立起與瀏覽器溝通的密碼,來阻擋只是請求資源並不打算好好看網站的惡意用戶(同時也對爬蟲Crawler有效),不過這邊要注意,不是說加了這道防線就可以完全阻擋攻擊,而是增加攻擊的難度

上次看到社群中有人自行開發了一套確認網站存活的網站,當下因為無聊,來幫忙測試寫了一個的Crawler,結果也觀察到他在防惡意用戶的手段是透過Server端產生的key來驗證服務請求,還不錯。(有趣的案例也不能打出來太多資訊,不然還真是造成人家困擾了)

為甚麼說只是增加攻擊難度? 因為儘管上面提到的案例有這麼做,我也還是可以為了要突破而去寫出相對應的工具。

下面是社群中那個人自己解了的做法範例,我這邊做一點優化調整

<?php
$reqMethod = getenv('REQUEST_METHOD');
$reqIP = filter_var(getenv('HTTP_CLIENT_IP'), FILTER_VALIDATE_IP) ? getenv('HTTP_CLIENT_IP') : (filter_var(getenv('HTTP_X_FORWARDED_FOR'), FILTER_VALIDATE_IP) ? getenv('HTTP_X_FORWARDED_FOR') : getenv('REMOTE_ADDR'));
$salt = "Only_U_Know_Me: {$reqIP} in ".round(time() / 604800, 0); 
$clientKey = md5($salt); //你猜不到的密碼,上面字串就隨你組合
$expires = gmdate("l, d-M-Y H:i:s T", time() + 604800); // 7 days

//若是自行開發的系統,可能有API的部分,那在POST方法上,這塊要記得避開,以免影響功能
if (strtoupper($reqMethod) == 'POST' /*&& EXCLUDE API URL REQUEST*/) {
    if (!isset($_COOKIE[$clientKey])){
        exit();
    }
}
//GET方法上也不能影響SEO操作,所以也是避開搜尋引擎,讓它們變白名單
if (strtoupper($reqMethod) == 'GET' && !preg_match('(Google|bing|Yahoo|Baidu|360|Sogou|facebookexternalhit)', getenv('HTTP_USER_AGENT'))) {
    if (!isset($_COOKIE[$clientKey])) {
        echo '<html><body>
        <script type = "text/javascript">
            function getCookie(cname) {
                var name = " " + cname + "=";
                var ca = document.cookie.split(";");
                for (var i = 0; i < ca.length; i++) {
                    var c = ca[i];
                    //while (c.charAt(0) == " ") c = c.substring(1);
                    if (c.indexOf(name) == 0) return c.substring(name.length, c.length);
                }
                return "";
            }
            document.cookie = "'.$clientKey.'=hi; expires='.$expires.'";
            if (getCookie("'.$clientKey.'") == "hi") {
                window.location.reload();
            }
        </script></body></html>';
        exit();
    }
}
//到這邊就是正常人才看得到的資訊了
echo "{$reqMethod}, {$reqIP}, {$clientKey}";

對於用戶體驗上來說只是在初次瀏覽時很快速的重新整理一下,若是系統內容本來就是要登入後才能看的,直接導向到登入頁面也是合情合理~

上面只是其中一種解法,端看要玩的花樣,費功一點就乾脆設計隨機選擇某個方法,搞到想hack網站的人看到就懶這樣XD

錢多好辦事版

Load Balancer 開下去,看是他請求的多還是你錢多這樣!! 哈哈哈,我想 老闆應該還是叫你選上面的辦法解決。(默)

Facebook 外掛整合

Share: