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

PHP 偽造 Referer 繞過防盜鏈:原理、代碼實現與風險提示

     編輯:PHP 綜合知識

原理

部分資源站通過檢查 Referer 判斷請求來源。偽造 Referer: 目標域名 並轉發請求,可繞過簡單防盜鏈。

完整實現(file.php)

<?php
// 用法:file.php/https://example.com/media.mp3
$rawUrl = str_replace('/file.php/', '', $_SERVER['REQUEST_URI']);
$url    = str_replace(' ', '%20', $url);
$url    = str_replace('https://', '', $url);

$parts   = explode('/', $url, 2);
$host    = $parts[0];
$request = '/' . ($parts[1] ?? '');

$fp = @fsockopen($host, 80, $errno, $errstr, 10);
if (!$fp) exit("無法連接 $host");

$out = "GET $request HTTP/1.0\r\n";
$out .= "Host: $host\r\n";
$out .= "Referer: https://$host/\r\n"; // 偽造
$out .= "User-Agent: Mozilla/5.0\r\n\r\n";
fwrite($fp, $out);

$response = '';
while (!feof($fp)) $response .= fgets($fp, 4096);
fclose($fp);

// 解析響應
if (strpos($response, '200 OK') !== false) {
    // 直接重定向原 URL(若對方無二次驗證)
    header("Location: https://$url");
    exit;
}

// 處理 302 重定向(常見防盜鏈:驗證 Referer 後 302 到真實地址)
if (preg_match('/Location:\s*(\S+)/i', $response, $m)) {
    header('Content-Type: application/force-download');
    header("Location: {$m[1]}");
    exit;
}

echo "獲取失敗";

安全與法律風險

  • ⚠️ **盜鏈行為** 侵犯帶寬資源,可能構成《計算機信息網絡國際聯網管理辦法》違規。
  • 現代防盜鏈:簽名 URL(帶過期時間)、Token 驗證、IP 白名單、User-Agent + Cookie 綁定,**單純 Referer 檢查已不可靠**。
  • 建議:自建 CDN、對象存儲(OSS/S3)簽名下載、或申請授權。

防禦側面:如何識別偽造 Referer

  • 檢查 X-Forwarded-For、Client-IP 一致性。
  • 要求關鍵操作攜帶一次性 Token(CSRF Token 機制)。
  • 日誌分析:Referer 與 User-Agent 不匹配、單 IP 高頻請求。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved