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

PHP cURL 偽造 HTTP 請求頭實戰:IP、User-Agent、Referer 全維度伪裝

     編輯:PHP 相關知識

PHP cURL 偽造 HTTP 請求頭實戰:IP、User-Agent、Referer 全維度伪裝

在爬蟲開發、API 測試、反防刷限流、安全滲透測試等場景中,偽造客戶端身份是繞過服務端驗證的核心手段。PHP cURL 庫提供了豐富的選項,可精細控制 User-Agent、Referer、X-Forwarded-For、Client-IP 等關鍵頭部。本文將從原理、代碼實現、實戰驗證三個維度完整演示。

> ⚠️ 法律與道德警示:偽造請求頭用於授權測試、自身業務開發屬合規行為;用於繞過他人防護、惡意爬取、刷量作弊等屬違法/違規行為,請嚴格遵守《網絡安全法》、目標站點 `robots.txt` 及服務條款。

核心偽造維度與對應 Header

偽造目標HTTP Header說明
客戶端標識User-Agent標識瀏覽器/設備型號,服務端常用於 UA 白名單/黑名單
來源頁面Referer防盜鏈、防 CSRF 核心依據,常偽造為首頁/搜尋引擎
客戶端真實 IPX-Forwarded-For (XFF)代理鏈標準頭,格式 client, proxy1, proxy2,首個為真實 IP
客戶端真實 IP (備用)Client-IP非標準但常見頭,部分 WAF/應用層直接讀取
偽造域名/HostHost虛擬主機路由依據,cURL 自動從 URL 解析,可手動覆蓋

完整偽造類實現

<?php

class HttpDisguise
{
    /** @var array 預設 User-Agent 池 */
    private static array $uaPool = [
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0',
        'Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Mobile/15E148 Safari/604.1',
        'Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36',
    ];

    /** @var array 常見代理 IP 段 (示例:百度/Google 爬蟲 IP 段,實際請用合法代理池) */
    private static array $proxyIpPools = [
        'baidu' => ['123.125.68.', '180.76.5.', '220.181.108.'],
        'google' => ['66.249.64.', '66.249.65.', '66.249.66.'],
    ];

    /**
     * 發起偽裝請求
     * @param string $url 目標 URL
     * @param array $options 額外 cURL 選項
     * @return string|false 響應體或失敗
     */
    public static function request(string $url, array $options = []): string|false
    {
        $ch = curl_init();

        // 基礎偽裝頭
        $ua = $options['ua'] ?? self::randomUa();
        $referer = $options['referer'] ?? 'https://www.google.com/';
        $xffIp = $options['xff_ip'] ?? self::randomProxyIp('baidu');
        $clientIp = $options['client_ip'] ?? self::randomProxyIp('google');

        $headers = [
            'User-Agent: ' . $ua,
            'Referer: ' . $referer,
            'X-Forwarded-For: ' . $xffIp,
            'Client-IP: ' . $clientIp,
            'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8',
            'Accept-Encoding: gzip, deflate, br',
            'Connection: keep-alive',
            'Upgrade-Insecure-Requests: 1',
            'Cache-Control: max-age=0',
        ];

        // 合併用戶自定義頭
        if (!empty($options['headers'])) {
            $headers = array_merge($headers, $options['headers']);
        }

        curl_setopt_array($ch, [
            CURLOPT_URL => $url,
            CURLOPT_HTTPHEADER => $headers,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_MAXREDIRS => 5,
            CURLOPT_CONNECTTIMEOUT => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_SSL_VERIFYPEER => false,  // 僅測試環境關閉,生產請配置 CA 憑證
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_ENCODING => 'gzip,deflate', // 自動解壓
            CURLOPT_COOKIEJAR => sys_get_temp_dir() . '/curl_cookie.txt', // 支援 Cookie 持久化
            CURLOPT_COOKIEFILE => sys_get_temp_dir() . '/curl_cookie.txt',
        ] + $options); // 允許覆蓋任意選項

        $response = curl_exec($ch);
        $errno = curl_errno($ch);
        $error = curl_error($ch);
        $info = curl_getinfo($ch);
        curl_close($ch);

        if ($errno) {
            error_log("cURL Error [$errno]: $error | URL: $url | HTTP: {$info['http_code']}");
            return false;
        }
        return $response;
    }

    private static function randomUa(): string
    {
        return self::$uaPool[array_rand(self::$uaPool)];
    }

    private static function randomProxyIp(string $poolKey): string
    {
        $pool = self::$proxyIpPools[$poolKey] ?? self::$proxyIpPools['baidu'];
        $base = $pool[array_rand($pool)];
        return $base . mt_rand(0, 255);
    }
}

// === 使用示例 ===
$html = HttpDisguise::request('https://httpbin.org/headers', [
    'referer' => 'https://www.baidu.com/s?wd=test',
    // 'proxy' => 'https://127.0.0.1:7890', // 如需真代理取消註釋
]);
echo $html ?: 'Request failed';

實戰驗證:httpbin.org 回顯請求頭

請求 https://httpbin.org/headers 可獲得服務端收到的完整頭部。實測輸出片段:

{
  "headers": {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Encoding": "gzip, deflate, br",
    "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
    "Client-Ip": "125.90.88.123",
    "Host": "httpbin.org",
    "Referer": "https://www.baidu.com/s?wd=test",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...",
    "X-Forwarded-For": "123.125.68.45"
  }
}

可見 Client-IP、X-Forwarded-For、Referer、User-Agent 均已成功偽造。

進階防檢測技巧 (防反爬)

  1. TLS 指紋偽裝:標準 cURL 的 TLS ClientHello 指紋極易被識別。建議使用 curl-impersonate (編譯版) 或 Go/Python utls 庫模擬 Chrome/Firefox 真實指紋。
  2. 真實代理 IP 池:隨機生成的 IP 段極易被威脅情報庫標記。必須接入高匿住宅代理/數據中心代理,並驗證可用性。
  3. Cookie/Session 保持:登入態業務需配合 CURLOPT_COOKIEJAR/FILE 持久化 Cookie,模擬真實用戶會話。
  4. 請求頻率/行為建模:固定間隔、固定 UA、無鼠標軌跡均為機器特徵。引入隨機延遲、UA 輪換、模擬點擊/滾動 (需無頭瀏覽器)。
  5. HTTP/2 或 HTTP/3:cURL 7.62+ 支援 HTTP/2 (CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0),更接近真實瀏覽器協商協議。

服務端防偽造最佳實踐 (防禦視角)

  • 🛡️ 不要信任任何客戶端頭部:X-Forwarded-For/Client-IP/X-Real-IP 僅作參考,真實客戶端 IP 以 TCP 連接層 REMOTE_ADDR 為準 (或受信任代理層傳遞的最後一跳)。
  • 🛡️ 配置受信任代理清單:Nginx set_real_ip_from / real_ip_header / real_ip_recursive 正確解析真實 IP。
  • 🛡️ UA 解析庫識別機器特徵:使用 ua-parser / DeviceDetector 識別無頭瀏覽器、爬蟲框架特徵 UA。
  • 🛡️ 行為分析 + 驗證碼:高頻、異常路徑、無 JS 執行環境觸發風控/滑塊驗證碼。

掌握 cURL 偽造全鏈路,既能助你高效完成授權測試、數據聚合,也能讓你從防禦者視角構建更堅固的風控體系。技術無善惡,用途定乾坤——請始終將其用於合法合規場景。

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