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

PHP cURL 偽造 IP 與 Header 請求頭完整實戰指南

     編輯:PHP 綜合知識

前言

在開發爬蟲、API 測試或跨域請求時,常需要偽造客戶端 IP 與請求頭。雖然 cURL 功能強大,但需注意:$_SERVER["REMOTE_ADDR"] 由伺服器根據 TCP 連線決定,無法從客戶端偽造。僅能透過 X-Forwarded-For、Client-IP 等標頭傳遞「聲稱」的 IP,能否生效取決於伺服器端解析邏輯。

核心代碼實現

客戶端發起請求 (client.php)

<?php
// 定義要偽造的 Header
$headers = [
    'CLIENT-IP' => '202.103.229.40',
    'X-FORWARDED-FOR' => '202.103.229.40',
];

// 轉換為 cURL 接受的格式
$headerArr = [];
foreach ($headers as $key => $value) {
    $headerArr[] = "$key: $value";
}

$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL => 'https://localhost/curl/server.php',
    CURLOPT_HTTPHEADER => $headerArr,        // 偽造 IP 標頭
    CURLOPT_REFERER => 'https://www.163.com/', // 偽造來源頁面
    CURLOPT_HEADER => true,                  // 包含回應標頭
    CURLOPT_RETURNTRANSFER => true,          // 返回字串而非直接輸出
]);

$response = curl_exec($ch);
curl_close($ch);

echo $response;

伺服器端解析邏輯 (server.php)

<?php
function getRealIp(): string
{
    // 依優先級檢查常見代理標頭
    $ipKeys = [
        'HTTP_CLIENT_IP',
        'HTTP_X_FORWARDED_FOR',
        'HTTP_X_REAL_IP',
        'REMOTE_ADDR',
    ];

    foreach ($ipKeys as $key) {
        if (!empty($_SERVER[$key])) {
            // X-Forwarded-For 可能包含多個 IP,取第一個
            $ips = explode(',', $_SERVER[$key]);
            return trim($ips[0]);
        }
    }
    return '無法獲取!';
}

echo "<br>訪問 IP: " . getRealIp() . "<br>";
echo "<br>訪問來路: " . ($_SERVER['HTTP_REFERER'] ?? '無');

關鍵點總結

  • REMOTE_ADDR 無法偽造:它是 TCP 層面的真實客戶端 IP。
  • 代理標頭僅供參考:伺服器需信任代理(如 Nginx set_real_ip_from)才會採納 X-Forwarded-For。
  • 安全提醒:切勿直接信任客戶端傳來的 IP 標頭做權限判斷,需配合伺服器層驗證。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved