防盜鏈是保護伺服器頻寬與資源的常見技術,防止他站直接連結你的圖片、下載檔案等資源。本文提供一個 PHP 防盜鏈實作範例,並說明核心判斷邏輯。
核心程式碼(dao4.php)
關鍵邏輯說明
- Referer 檢查:透過
$HTTP_REFERER(或 $_SERVER['HTTP_REFERER'])取得請求來源。
- 白名單比對:使用
ereg()(註:PHP 5.3+ 已棄用,建議改用 preg_match())比對允許的域名。
- 動態下載路徑:根據
site 參數選擇對應的下載伺服器位置。
- 統一導向:合法請求導向真實檔案,非法請求導向預設錯誤頁。
安全性與改進建議
- Referer 可偽造:此方案僅能阻擋一般熱連結,無法防禦惡意偽造 Referer 的爬蟲。
- 建議改用 Token 機制:下載頁面生成一次性 Token 存入 Session,下載驗證頁驗證 Token 並檢查過期時間。
- 簽名 URL(Signed URL):結合時間戳、檔案路徑、密鑰生成簽名,URL 本身帶有驗證資訊,更適合大型系統。
- Nginx/Apache 層面防盜鏈:在 Web Server 層設定
valid_referers 或 RewriteCond 效能更好、更難繞過。
本範例展示了 PHP 層面防盜鏈的基本實作邏輯,實際部署請根據業務安全需求選擇更健全的方案。