$_SERVER['HTTP_REFERER'] 儲存了用戶點擊連結前所在頁面的 URL,常用於防盜鏈、統計來源、回跳導向等場景。但它屬於客戶端可控的 HTTP 標頭,**不可完全信任**。本文將示範基本用法、偽造手法與防禦策略。
<?php
if (isset($_SERVER['HTTP_REFERER'])) {
echo '上一頁來源:' . htmlspecialchars($_SERVER['HTTP_REFERER']);
} else {
echo '直接訪問或瀏覽器未發送 Referer';
}
?>
⚠️ 提醒:隱私模式、安全軟體、Meta 標籤 <meta name="referrer" content="no-referrer"> 都會導致此值為空。
使用 fsockopen 或 cURL 可自訂 Referer 標頭:
<?php
// fsockopen 範例
$host = 'example.com';
$fp = fsockopen($host, 80, $errno, $errstr, 30);
if ($fp) {
$request = "GET /target.php HTTP/1.1\r\n"
. "Host: $host\r\n"
. "Referer: https://fake-source.com/\r\n"
. "Connection: Close\r\n\r\n";
fwrite($fp, $request);
while (!feof($fp)) echo fgets($fp, 1024);
fclose($fp);
}
// cURL 更簡潔
$ch = curl_init('https://example.com/target.php');
curl_setopt_array($ch, [
CURLOPT_REFERER => 'https://fake-source.com/',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
]);
echo curl_exec($ch);
curl_close($ch);
?>
若目標站回應 Content-Encoding: gzip,fsockopen 取得的是壓縮後的二進位資料。解決方案:
Accept-Encoding: identity 拒絕壓縮。file_get_contents() / cURL(預設自動解壓)。gzinflate(substr($response, 10, -8))(需確認 gzip 格式)。valid_referers,效能優於 PHP 判斷。document.referrer(前端 JS)交叉驗證。HTTP_REFERER 只是參考資訊,**永遠不要用於授權決策**。開發時應假設它可能為空、被偽造、或被瀏覽器移除,設計容錯邏輯才是正確姿勢。