首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 防 CC 攻擊與頁面惡意刷新的多層防禦策略與代碼實現

     編輯:PHP 綜合知識

前言

CC 攻擊(Challenge Collapsar)通過代理服務器模擬大量合法請求,針對消耗資源的頁面(如複雜查詢、大數據導出)發起高併發訪問,導致服務器 CPU 100%、連接池耗盡、正常用戶無法訪問。本文提供從應用層代碼防禦、Session/ Cookie 機制、表單 Token 驗證、IP 限流到架構層建議的完整防禦體系,附帶可直接部署的 PHP 代碼。

核心防禦代碼:Session 基礎頻率限制(3 秒 5 次)

 $limit) {
            // 觸發防禦:重定向到本地、靜態頁、或直接退出
            header('Location: https://127.0.0.1/'); // 或顯示驗證碼頁面
            exit('請求過於頻繁,請稍後再試');
        }
    } else {
        // 超過窗口,重置計數
        $_SESSION['cc_last_time'] = $timestamp;
        $_SESSION['cc_count'] = 1;
    }
}

進階防禦策略對比

策略原理優點缺點適用場景
Session 計數服務端記錄用戶會話請求數無需用戶操作、部署簡單攻擊者可偽造 Session ID、清除 Cookie 繞過基礎防禦、配合其他策略
Cookie 標記設置短期 Cookie,檢查是否存在極簡單、性能極高用戶可禁用/清除 Cookie輕量級接口保護
表單 Token表單隱藏字段攜帶一次性 Token,提交驗證有效防重複提交、CSRF不防直接 URL 訪問、需模板配合表單提交、POST 接口
IP 限流基於客戶端 IP 計數(Redis/數據庫/文件)難繞過、可分佈式誤傷同 IP 合法用戶(企業出口、代理)核心接口、登錄/註冊/下單
驗證碼圖形/短信/滑塊驗證碼人機識別、強防禦用戶體驗下降、增加開發成本高價值操作(登錄、支付、發帖)
行為分析User-Agent、請求間隔、路徑特徵、指紋精準識別腳本/爬蟲複雜、需大數據支撐高級防護、WAF 層

多層防禦代碼實現集

1. Cookie 級極速防禦(3 秒內禁止重複請求)



2. 表單 Token 防重複提交(Session + 隱藏字段)

">

// 處理頁面
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (!isset($_POST['token']) || $_POST['token'] !== ($_SESSION['form_token'] ?? '')) {
        die('非法請求或表單已過期,請刷新重試');
    }
    // 驗證通過,消費 token
    unset($_SESSION['form_token']);
    // 業務邏輯...
}

3. IP 級分佈式限流(Redis 滑動窗口,推薦生產環境)

connect('127.0.0.1', 6379);

$ip = $_SERVER['REMOTE_ADDR']; // 實際生產需考慮 X-Forwarded-For
$key = "ratelimit:ip:$ip";
$limit = 100;    // 最大請求數
$window = 60;    // 時間窗口(秒)

$current = $redis->incr($key);
if ($current === 1) {
    $redis->expire($key, $window);
}

if ($current > $limit) {
    $ttl = $redis->ttl($key);
    header("Retry-After: $ttl");
    http_response_code(429);
    exit(json_encode(['error' => '請求過於頻繁', 'retry_after' => $ttl]));
}

// 業務邏輯...

4. 綜合防禦中間件(可作為公共引入文件)

 200,      // IP 每分鐘最大請求
        'ip_window' => 60,
        'session_limit' => 30,  // Session 每 10 秒最大請求
        'session_window' => 10,
        'cookie_window' => 2,   // Cookie 級最小間隔
        'whitelist_ips' => ['127.0.0.1', '10.0.0.0/8'], // CIDR 白名單
        'whitelist_uas' => ['Baiduspider', 'Googlebot'], // 爬蟲白名單
    ];
    
    public function __construct($redisHost = '127.0.0.1', $redisPort = 6379) {
        $this->redis = new Redis();
        $this->redis->connect($redisHost, $redisPort);
        session_start();
    }
    
    public function handle() {
        $ip = $this->getRealIp();
        
        // 1. IP 白名單
        if ($this->isWhitelisted($ip)) return true;
        
        // 2. User-Agent 白名單(搜索引擎爬蟲)
        if ($this->isBotWhitelisted()) return true;
        
        // 3. Cookie 級極速攔截(最輕量)
        if (isset($_COOKIE['cc_shield'])) {
            $this->respond429('Cookie 級限流');
            return false;
        }
        setcookie('cc_shield', '1', time() + $this->config['cookie_window'], '/', '', false, true);
        
        // 4. Session 級限流
        if (!$this->checkSessionLimit()) {
            $this->respond429('Session 級限流');
            return false;
        }
        
        // 5. IP 級分佈式限流(核心)
        if (!$this->checkIpLimit($ip)) {
            $this->respond429('IP 級限流');
            return false;
        }
        
        return true;
    }
    
    private function getRealIp() {
        // 實際生產需解析 X-Forwarded-For、X-Real-IP,並信任反向代理層
        return $_SERVER['REMOTE_ADDR'];
    }
    
    private function isWhitelisted($ip) {
        foreach ($this->config['whitelist_ips'] as $cidr) {
            if (strpos($cidr, '/') !== false) {
                list($range, $mask) = explode('/', $cidr);
                if ((ip2long($ip) & ~((1 << (32 - $mask)) - 1)) == ip2long($range)) return true;
            } elseif ($ip === $cidr) return true;
        }
        return false;
    }
    
    private function isBotWhitelisted() {
        $ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
        foreach ($this->config['whitelist_uas'] as $bot) {
            if (stripos($ua, $bot) !== false) return true;
        }
        return false;
    }
    
    private function checkSessionLimit() {
        $now = time();
        $key = 'cc_session';
        if (!isset($_SESSION[$key])) {
            $_SESSION[$key] = ['time' => $now, 'count' => 1];
            return true;
        }
        $data = $_SESSION[$key];
        if ($now - $data['time'] < $this->config['session_window']) {
            if (++$data['count'] > $this->config['session_limit']) return false;
        } else {
            $data = ['time' => $now, 'count' => 1];
        }
        $_SESSION[$key] = $data;
        return true;
    }
    
    private function checkIpLimit($ip) {
        $key = "ratelimit:ip:$ip";
        $limit = $this->config['ip_limit'];
        $window = $this->config['ip_window'];
        
        $current = $this->redis->incr($key);
        if ($current === 1) $this->redis->expire($key, $window);
        
        return $current <= $limit;
    }
    
    private function respond429($reason) {
        header('Content-Type: application/json; charset=utf-8');
        http_response_code(429);
        echo json_encode(['error' => '請求過於頻繁', 'reason' => $reason], JSON_UNESCAPED_UNICODE);
        exit;
    }
}

// 使用方式:入口文件最頂部
// require_once 'CcDefender.php';
// $defender = new CcDefender();
// $defender->handle();

架構層面建議(代碼之外的防線)

  1. Web 應用防火牆(WAF):ModSecurity + OWASP CRS、云 WAF(阿里云/騰訊云/Cloudflare)
  2. 負載均衡層限流:Nginx limit_req_zone、HAProxy rate limiting
  3. CDN 緩存靜態資源:減少源站壓力,隱藏真實 IP
  4. 服務器資源隔離:核心業務獨立部署、容器化資源限制
  5. 監控告警體系:QPS 突增、錯誤率上升、CPU/內存異常自動告警
  6. 應急預案:一鍵開啟驗證碼、IP 黑名單、降級熔斷開關

總結

CC 攻擊防禦是系統工程,單一代碼層面方案無法完全解決。建議採用纏深度防禦體系:

  • 應用層:Session/Cookie/Token/IP 多維限流(本文代碼可直接使用)
  • 接入層:Nginx limit_req + WAF 規則
  • 網絡層:CDN 隱藏源站 + 云防護
  • 業務層:高風險操作強制驗證碼、異步處理削峰

開發階段引入 CcDefender 中間件,配合 Redis 分佈式限流,可抵禦 90% 以上的腳本級 CC 攻擊。大規模攻擊仍需依賴專業防護產品與架構彈性設計。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved