本篇文章更新時間:2019/02/16
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知或向一介資男的 LINE 社群反應。
如果本站內容對你有幫助,歡迎贊助支持 。
昨天滑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 開下去,看是他請求的多還是你錢多這樣!! 哈哈哈,我想 老闆應該還是叫你選上面的辦法解決。(默)
