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

PHP cURL 偽造 IP 與請求頭實戰:原理、代碼與防禦繞過

     編輯:PHP 相關知識

PHP cURL 偽造 IP 與請求頭實戰:原理、代碼與防禦繞過

cURL 是 PHP 進行 HTTP 通訊的瑞士軍刀,支援 HTTP/HTTPS、FTP、代理、Cookie、斷點續傳等豐富功能。本文深入講解如何利用 cURL 偽造客戶端 IP(`X-Forwarded-For`、`Client-IP`)、User-Agent、Referer 等請求頭,並分析服務端識別真實 IP 的機制與防禦繞過策略。

一、 環境準備與基礎配置

  1. 啟用擴展:`php.ini` 中取消註釋 `extension=curl`,重啟 PHP-FPM/Apache。
  2. 驗證:`php -m | grep curl` 或 `phpinfo()` 查看 cURL 版本與協議支持。

二、 核心偽造參數詳解

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攜帶/持久化 Cookiesession_id=abc123; user=admin
CURLOPT_PROXY代理服務器(真正換 IP)https://proxy_ip:port
CURLOPT_INTERFACE指定本機出口網卡 IPeth0:1 或具體 IP
CURLOPT_FOLLOWLOCATION自動跟隨 3xx 重定向true
CURLOPT_SSL_VERIFYPEER驗證 SSL 證書(生產建議 true)false(測試環境)

三、 偽造 X-Forwarded-For / Client-IP 完整代碼

<?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 池獲取與驗證腳本

從免費代理網站抓取 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));
?>

五、 服務端識別真實 IP 的機制與繞過局限

1. 不可偽造的層面

  • TCP 連接源 IP(`$_SERVER['REMOTE_ADDR']`):三次握手建立的網絡層地址,無法通過應用層偽造。除非使用真實代理/VPN/住宅 IP 池發起物理連接。
  • TLS 握手 SNI/證書綁定:HTTPS 建立連接前已暴露真實 IP。

2. 可偽造但會被驗證的層面

3. 實戰防禦繞過策略

  1. 使用高匿代理/住宅 IP 池:請求真正從目標 IP 發出,`REMOTE_ADDR` 即為偽造 IP(成本最高,效果最真)。
  2. 利用誤配置的受信代理:目標站點信任特定 CIDR(如 `10.0.0.0/8`),若能控制該網段機器(如內網滲透、SSRF),可注入任意 XFF。
  3. Header 注入變體:嘗試 `X-Forwarded-For: , 1.2.3.4` 測試 XSS/日志注入(屬安全測試範疇)。
  4. 協議降級:強制 HTTP/1.0 無 `Host` 頭、無 `Connection: keep-alive`,某些簡陋 WAF 可能放行。

六、 法律與道德邊界

⚠️ 嚴正聲明:

  • 偽造 IP 進行惡意刷單、暴力破解、爬蟲盜數據、DDoS 攻擊、繞過訪問控制均屬違法犯罪(《網絡安全法》、《刑法》第 285/286 條)。
  • 本文技術僅供授權滲透測試、爬蟲反反爬研究、多地域業務測試、安全防禦驗證等合法場景使用。
  • 生產環境請使用合法代理服務商(Bright Data、Oxylabs、ScraperAPI 等)或自建合規代理池。

七、 總結

cURL 偽造請求頭技術門檻低,但真實 IP(TCP 層)無法偽造是核心限制。現代 WAF/CDN(Cloudflare、阿里云盾、騰訊云 WAF)均以 `REMOTE_ADDR` 為準,結合行為分析、指紋識別、JS 挑戰,單純 Header 偽造早已失效。合規業務請選擇正規代理服務;安全研究請在授權範圍內進行,切勿觸犯法律紅線。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
頭字段服務端常見驗證邏輯繞過難度
X-Forwarded-For信任已知代理 IP 白名單(如 CDN、LB 內網段),取最後一個非受信 IP高(需控制受信代理)
X-Real-IPNginx `proxy_set_header X-Real-IP $remote_addr;` 直接覆蓋極高
CF-Connecting-IPCloudflare 專用,邊緣節點注入,不可偽造不可繞過
True-Client-IPAkamai/Cloudflare Enterprise 專用不可繞過