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

PHP $_SERVER['HTTP_REFERER'] 使用詳解與偽造/防範實戰

     編輯:PHP 綜合知識

$_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"> 都會導致此值為空。

偽造 Referer 實作(僅供測試/學習)

使用 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);
?>

常見坑:GZIP 回應導致亂碼

若目標站回應 Content-Encoding: gzip,fsockopen 取得的是壓縮後的二進位資料。解決方案:

  • 請求標頭加入 Accept-Encoding: identity 拒絕壓縮。
  • 或使用 file_get_contents() / cURL(預設自動解壓)。
  • 手動解壓:gzinflate(substr($response, 10, -8))(需確認 gzip 格式)。

防範與最佳實踐

  1. 關鍵業務勿依賴 Referer:CSRF 防護請用 Token、SameSite Cookie、雙重驗證。
  2. 防盜鏈:Nginx/Apache 層面配置 valid_referers,效能優於 PHP 判斷。
  3. 統計來源:搭配 UTM 參數、document.referrer(前端 JS)交叉驗證。
  4. 白名單機制:僅允許已知域名的 Referer 通過,其餘視為可疑。

總結

HTTP_REFERER 只是參考資訊,**永遠不要用於授權決策**。開發時應假設它可能為空、被偽造、或被瀏覽器移除,設計容錯邏輯才是正確姿勢。

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