在開發網頁爬蟲、測試防盜鏈或模擬瀏覽器行為時,我們常需要偽造 HTTP Referer 標頭。PHP 雖然沒有內建直接修改發出請求 Referer 的函數,但透過底層的 Socket 連線,我們可以手動構建 HTTP 請求標頭,從而實現 Referer 偽造。
以下範例展示如何使用 fsockopen 建立 TCP 連線,並手動發送帶有自訂 Referer 的 GET 請求:
<?php
error_reporting(E_ERROR | E_WARNING | E_PARSE);
set_time_limit(0);
$server = 'www.example.com'; // 目標服務器 IP 或域名
$host = 'www.example.com'; // Host 標頭
$target = '/test.php?x=1'; // 請求路徑
$referer = 'https://www.referrer.com/page.html'; // 偽造的 Referer
$port = 80;
$fp = fsockopen($server, $port, $errno, $errstr, 30);
if (!$fp) {
echo "<h1>無法連接遠程服務器</h1><h3>$errstr ($errno)</h3>";
} else {
$out = "GET $target HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Referer: $referer\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
?>
Host、Referer、Connection 等標頭,並以雙 CRLF (\r\n\r\n) 結束標頭區塊。此技巧常用於:
安全提醒:偽造 Referer 可能違反目標網站服務條款,請僅在授權測試或學習研究範圍內使用。