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

HTTP Referer 機制詳解:防盜鏈實作與偽造防範完整指南

     編輯:PHP 相關知識

HTTP Referer(標準拼寫為 Referrer)是請求標頭之一,告知伺服器請求來源頁面。雖可用於防盜鏈、統計分析,但極易偽造,絕不可用於身份驗證等安全關鍵邏輯。本文系統整理原理、防盜鏈配置、偽造手法與防禦建議。

Referer 基本特性

  • 瀏覽器導航、圖片/腳本/樣式請求均會攜帶。
  • HTTPS → HTTP 導航時,瀏覽器不發送 Referer(RFC 7231 §5.5.2),避免洩露敏感 URL。
  • 可透過瀏覽器設定(Firefox network.http.sendRefererHeader)、Proxy(Privoxy)、程式庫(cURL、fsockopen)任意修改或隱藏。

Apache 防盜鏈配置範例

<!-- 僅允許自家域名與直接訪問 -->
SetEnvIfNoCase Referer "^https?://(www\.)?example\.com/" local_ref
SetEnvIf Referer "^$" local_ref

<FilesMatch "\.(gif|jpe?g|png|webp)$">
    Order Deny,Allow
    Deny from all
    Allow from env=local_ref
</FilesMatch>

或針對目錄:

<Directory "/var/www/images">
    Order Deny,Allow
    Deny from all
    Allow from env=local_ref
</Directory>

常見偽造手法(僅供防禦理解)

PHP cURL

$ch = curl_init('https://target.com/image.jpg');
curl_setopt($ch, CURLOPT_REFERER, 'https://allowed.com/');
curl_exec($ch);

PHP fsockopen 原始 Socket

$fp = fsockopen('target.com', 80);
fwrite($fp, "GET /image.jpg HTTP/1.1\r\nHost: target.com\r\nReferer: https://allowed.com/\r\nConnection: Close\r\n\r\n");

JavaScript(受限)

瀏覽器安全策略禁止 JS 任意設定 Referer,xmlHttp.setRequestHeader('Referer', ...) 會被忽略或拋錯。

防禦建議

  1. 防盜鏈僅作阻擋誤連,接受可被繞過的事實。
  2. 關鍵資源驗證:採用簽名 URL(帶有效期 Token)、Cookie/Session 驗證、JWT、OAuth 等機制。
  3. 圖片/下載服務:走獨立域名 + 簽名 URL + Referer 雙重檢查,提高繞過成本。
  4. 監控異常流量:大量空 Referer 或異常 Referer 觸發告警/限流。

總結

Referer 是「禮貌性」標頭,非「安全性」憑證。防盜鏈配置簡單有效,能阻擋 90% 以上誤連與簡單爬蟲,但絕不可作為授權依據。

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