CC 攻擊(Challenge Collapsar)通過代理服務器模擬大量合法請求,針對消耗資源的頁面(如複雜查詢、大數據導出)發起高併發訪問,導致服務器 CPU 100%、連接池耗盡、正常用戶無法訪問。本文提供從應用層代碼防禦、Session/ Cookie 機制、表單 Token 驗證、IP 限流到架構層建議的完整防禦體系,附帶可直接部署的 PHP 代碼。
$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 層 |
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();架構層面建議(代碼之外的防線)
- Web 應用防火牆(WAF):ModSecurity + OWASP CRS、云 WAF(阿里云/騰訊云/Cloudflare)
- 負載均衡層限流:Nginx
limit_req_zone、HAProxy rate limiting- CDN 緩存靜態資源:減少源站壓力,隱藏真實 IP
- 服務器資源隔離:核心業務獨立部署、容器化資源限制
- 監控告警體系:QPS 突增、錯誤率上升、CPU/內存異常自動告警
- 應急預案:一鍵開啟驗證碼、IP 黑名單、降級熔斷開關
總結
CC 攻擊防禦是系統工程,單一代碼層面方案無法完全解決。建議採用纏深度防禦體系:
開發階段引入 CcDefender 中間件,配合 Redis 分佈式限流,可抵禦 90% 以上的腳本級 CC 攻擊。大規模攻擊仍需依賴專業防護產品與架構彈性設計。