今天小編在群裡閒扯,有幾位小夥伴就提到了 CC 攻擊,正好 www.weixiaoduo.com 也很久沒更新了,藉此水一篇教程~大多數新人在初期建站時使用的都是虛擬主機,環境都是由 IDC 預先配置好的,所以,遇到小規模的 CC 攻擊也許感覺不到什麼,但是由於是虛擬主機的可定製性太差了,正好建站一段時間,網站也漸漸有了起色,流量也多,換個小記憶體 vps 用用也挺爽的,谷歌百度一下找個教程依葫蘆畫瓢把 VPS 環境一裝好就屁顛屁顛的給網站搬家了。可是沒過幾天,卻發現訪問網站頻繁的出錯、訪問超時、甚至無法訪問,頓時就覺得被 IDC 坑了,立馬找客服理論去。結果 IDC 直接調出網站日誌,留下一句 「網站被 CC 了」 就再也不答理你了。哈哈~貌似撤的有點多啊,不過當年小編還在讀高一的時候,自己建立的第一個網站就是這樣被毀了的,所以嘮嗑有點多啊,直接步入正題:

nginx 下防 cc 方法, 利用 ngx_http_limit_conn_module 模組限制連線數:

http {
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    ...

    server {

        ...

        location /download/ {
            limit_conn addr 1;
        }
語法: limit_conn zone number;
預設值:
上下文: http, server, location

指定一塊已經設定的共享記憶體空間,以及每個給定鍵值的最大連線數。當連線數超過最大連線數時,伺服器將會返回 503 (Service Temporarily Unavailable) 錯誤。比如,如下配置

limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
    location /download/ {
        limit_conn addr 1;
    }

表示,同一 IP 同一時間只允許有一個連線,具體參考 nginx 官方幫助檔案:http://nginx.org/cn/docs/http/ngx_http_limit_conn_module.html

WordPress 防 cc 程式碼:

//防止 CC 攻擊
session_start(); //開啟 session
$timestamp = time();
$ll_nowtime = $timestamp ;
//判斷 session 是否存在 如果存在從 session 取值,如果不存在進行初始化賦值
if ($_SESSION){
  $ll_lasttime = $_SESSION['ll_lasttime'];
  $ll_times = $_SESSION['ll_times'] + 1;
  $_SESSION['ll_times'] = $ll_times;
}else{
  $ll_lasttime = $ll_nowtime;
  $ll_times = 1;
  $_SESSION['ll_times'] = $ll_times;
  $_SESSION['ll_lasttime'] = $ll_lasttime;
}
//現在時間-開始登入時間 來進行判斷 如果登入頻繁 跳轉 否則對 session 進行賦值
if(($ll_nowtime - $ll_lasttime) < 3){
  if ($ll_times>=5){
header("location:http://127.0.0.1");
  exit;
  }
}else{
  $ll_times = 0;
  $_SESSION['ll_lasttime'] = $ll_nowtime;
  $_SESSION['ll_times'] = $ll_times;
}

以上程式碼直接丟到主題的 functions.php 檔案即可。 (PS:以上程式碼來自 90blog