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

HTTP Referer 偽造與防範完整指南:從原理到實戰防禦

     編輯:PHP 相關知識

HTTP Referer 請求標頭標識來源頁面,廣泛用於防盜鏈、統計分析,但極易偽造,絕不可用於身份驗證、授權決策等安全關鍵邏輯。本文系統整理偽造手法、防禦策略與現代替代方案。

Referer 基本特性

  • 瀏覽器導航、子資源請求(圖片/腳本/樣式/字體)均攜帶。
  • HTTPS → HTTP 導航時,瀏覽器不發送 Referer(RFC 7231 §5.5.2)。
  • 用戶可透過瀏覽器設定、擴充套件、Proxy、程式庫任意修改/隱藏。

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

PHP cURL

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

PHP fsockopen 原始 Socket

$fp = fsockopen('target.com', 443);
$out = "GET /protected.jpg HTTP/1.1\r\n";
$out .= "Host: target.com\r\n";
$out .= "Referer: https://allowed.com/page.html\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);

命令列工具

curl -H "Referer: https://allowed.com/" https://target.com/image.jpg
wget --referer="https://allowed.com/" https://target.com/image.jpg

JavaScript(受限)

瀏覽器安全策略禁止 JS 任意設定 Referer,fetch/XMLHttpRequest 的 referrerPolicy 僅能控制發送策略(no-referrer、origin、same-origin 等),無法自訂任意值。

防禦策略分層

  1. 接受可繞過:Referer 防盜鏈僅阻擋「誤連」與「簡單爬蟲」,將繞過成本提高即可。
  2. 簽名 URL(推薦):私有資源生成帶有效期、防篡改簽名的 URL(如 AWS S3 Pre-signed URL、JWT Token),無需依賴 Referer。
  3. Cookie/Session 驗證:登入態驗證配合 SameSite Cookie、CSRF Token。
  4. 雙重檢查:Referer + User-Agent + IP 速率限制,提高批量盜鏈成本。
  5. 監控告警:大量空 Referer、異常 Referer 域名、高頻存取觸發 WAF 規則。

Apache/Nginx 防盜鏈配置

# Nginx
location ~* \.(gif|jpe?g|png|webp)$ {
    valid_referers none blocked *.example.com example.com;
    if ($invalid_referer) { return 403; }
}

# Apache
SetEnvIfNoCase Referer "^https?://(www\.)?example\.com/" local_ref
SetEnvIf Referer "^$" local_ref

    Order Deny,Allow
    Deny from all
    Allow from env=local_ref

現代替代:Referrer-Policy

透過 HTTP 標頭或 <meta name="referrer"> 控制瀏覽器發送策略:

Referrer-Policy: strict-origin-when-cross-origin
# 同源發送完整 URL,跨源僅發送 origin,HTTPS→HTTP 不發送

配合 CSP、COOP/COEP、Signed Exchanges 進一步鎖定資源存取上下文。

總結

Referer 是「禮貌性」標頭,非「安全性」憑證。防盜鏈配置簡單有效,能阻擋 90% 以上誤連,但絕不可作為授權依據。關鍵資源務必採用簽名 URL 或 Token 驗證。

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