cURL 是 PHP 進行 HTTP 通訊的瑞士軍刀,支援 HTTP/HTTPS、FTP、代理、Cookie、斷點續傳等豐富功能。本文深入講解如何利用 cURL 偽造客戶端 IP(`X-Forwarded-For`、`Client-IP`)、User-Agent、Referer 等請求頭,並分析服務端識別真實 IP 的機制與防禦繞過策略。
| CURLOPT 選項 | 作用 | 典型值示例 |
|---|---|---|
CURLOPT_HTTPHEADER | 自定義請求頭數組 | ['X-Forwarded-For: 1.2.3.4', 'Client-IP: 5.6.7.8'] |
CURLOPT_USERAGENT | 偽造瀏覽器標識 | Mozilla/5.0 (Windows NT 10.0; Win64; x64)... |
CURLOPT_REFERER | 偽造來源頁面 | https://www.google.com/ |
CURLOPT_COOKIE / CURLOPT_COOKIEFILE | 攜帶/持久化 Cookie | session_id=abc123; user=admin |
CURLOPT_PROXY | 代理服務器(真正換 IP) | https://proxy_ip:port |
CURLOPT_INTERFACE | 指定本機出口網卡 IP | eth0:1 或具體 IP |
CURLOPT_FOLLOWLOCATION | 自動跟隨 3xx 重定向 | true |
CURLOPT_SSL_VERIFYPEER | 驗證 SSL 證書(生產建議 true) | false(測試環境) |
<?php
/**
* 批量偽造 IP 訪問目標 URL
* @param string $url 目標地址
* @param array $ipList IP 池 ['1.2.3.4', '5.6.7.8', ...]
* @param int $delay 請求間隔微秒(防封禁)
*/
function spoofIpRequest(string $url, array $ipList, int $delay = 500000): void {
foreach ($ipList as $ip) {
$ch = curl_init($url);
// 核心偽造頭
$headers = [
'X-Forwarded-For: ' . $ip, // 標準代理頭
'Client-IP: ' . $ip, // 非標準但常用
'X-Real-IP: ' . $ip, // Nginx 真實 IP 傳遞頭
'X-Originating-IP: ' . $ip, // 郵件/負載均衡常用
'Forwarded: for=' . $ip, // RFC 7239 標準
'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer: https://www.bing.com/',
'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8',
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
];
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => $headers,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => true, // 包含響應頭
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_MAXREDIRS => 5,
CURLOPT_TIMEOUT => 10,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_SSL_VERIFYPEER => false, // 僅測試環境
CURLOPT_SSL_VERIFYHOST => false,
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$errno = curl_errno($ch);
$error = curl_error($ch);
curl_close($ch);
// 簡單結果輸出
echo "IP: {$ip} | HTTP: {$httpCode} | Err: {$errno} | Len: " . strlen($response) . "\n";
usleep($delay); // 禮貌延遲
}
}
// 使用示例
$target = 'https://httpbin.org/headers'; // 測試端點,返回接收到的頭
$ips = ['103.45.67.89', '202.98.123.45', '180.168.200.11'];
spoofIpRequest($target, $ips);
?>
從免費代理網站抓取 IP,並驗證可用性:
<?php
function fetchAndValidateProxies(string $sourceUrl, int $testTimeout = 5): array {
$ch = curl_init($sourceUrl);
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER=>true, CURLOPT_TIMEOUT=>10]);
$html = curl_exec($ch);
curl_close($ch);
// 簡單正則提取 IP:PORT(實際需針對具體網站結構)
preg_match_all('/\b(?:\d{1,3}\.){3}\d{1,3}:\d{2,5}\b/', $html, $matches);
$candidates = array_unique($matches[0]);
$valid = [];
foreach ($candidates as $proxy) {
$testCh = curl_init('https://httpbin.org/ip');
curl_setopt_array($testCh, [
CURLOPT_PROXY => $proxy,
CURLOPT_PROXYTYPE => CURLPROXY_HTTP,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => $testTimeout,
CURLOPT_SSL_VERIFYPEER => false,
]);
$res = curl_exec($testCh);
if (curl_getinfo($testCh, CURLINFO_HTTP_CODE) === 200) {
$valid[] = $proxy;
echo "✓ Valid: {$proxy}\n";
} else {
echo "✗ Failed: {$proxy}\n";
}
curl_close($testCh);
}
return $valid;
}
// 使用
$proxies = fetchAndValidateProxies('https://www.free-proxy-list.net/');
file_put_contents('valid_proxies.json', json_encode($proxies));
?>
| 頭字段 | 服務端常見驗證邏輯 | 繞過難度 |
|---|---|---|
| X-Forwarded-For | 信任已知代理 IP 白名單(如 CDN、LB 內網段),取最後一個非受信 IP | 高(需控制受信代理) |
| X-Real-IP | Nginx `proxy_set_header X-Real-IP $remote_addr;` 直接覆蓋 | 極高 |
| CF-Connecting-IP | Cloudflare 專用,邊緣節點注入,不可偽造 | 不可繞過 |
| True-Client-IP | Akamai/Cloudflare Enterprise 專用 | 不可繞過 |