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