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

PHP 實現防盜鏈的多種策略與程式碼範例

     編輯:PHP 相關知識

盜鏈會消耗伺服器頻寬且損害站長利益。本文介紹 PHP 端防盜鏈的核心思路,並提供三種不同層級的實作範例:簡單 Referer 檢查、下載頁面 Token 驗證、伺服器層面配置建議。

核心防盜鏈邏輯:下載頁面 Token 機制

  1. 定義一個密鑰 $key = 'sdkfjwojf32413'(放在公共配置檔)。
  2. 下載頁面生成隨機數 $certcode = '84615354'(每次不同)。
  3. 結合檔案 ID、$certcode、$key 生成 MD5:$codekey = md5($id . $certcode . $key)。
  4. 真實下載連結:file.php?id=5&codekey=ksfjwofsdkfsf。
  5. 將 $certcode 存入 Session。
  6. file.php 驗證 codekey 是否匹配,成功則刪除 Session、讀取檔案內容輸出(而非直接導向檔案 URL),失敗則跳轉錯誤頁。

此機制確保:下載連結一次性、不可預測、必須經過自家下載頁面。

範例 1:簡單 Referer 白名單檢查

<?php
$ADMIN['defaulturl'] = "https://www.example.com/404.htm";
$okaysites = array("https://www.example.com/", "https://partner.com/");
$ADMIN['url_1'] = "https://www.example.com/temp/download/";

$reffer = $_SERVER['HTTP_REFERER'];
if ($reffer) {
    $yes = 0;
    foreach ($okaysites as $domain) {
        if (strpos($reffer, $domain) === 0) { $yes = 1; break; }
    }
    $theu = "url_1"; // 簡化示範
    if ($ADMIN[$theu] && $yes == 1) {
        header("Location: $ADMIN[$theu]/$file");
    } else {
        header("Location: $ADMIN[defaulturl]");
    }
} else {
    header("Location: $ADMIN[defaulturl]");
}
?>

使用方式:dao4.php?site=1&file=validatecode.rar

範例 2:檔案下載防盜鏈(含例外域名)

<?php
$fileRelPath = "../../software";
$excludeReferArr = array("www.example.com", "example.com", ""); // 空字串允許直接輸入網址
chdir($fileRelPath);
$fileRootPath = getcwd() . "/";
$filePath = $_GET['file'];
$url = parse_url($_SERVER['HTTP_REFERER']);
if ($url['host'] != $_SERVER['HTTP_HOST'] && !in_array($url['host'], $excludeReferArr)) {
    exit('盜鏈被攔截');
}
// ... 後續輸出檔案內容
?>

其他防盜鏈方向

  • IIS/Apache/Nginx 層面:利用 mod_rewrite、ISAPI_Rewrite 或 Nginx valid_referers 指令,效能優於 PHP 層。
  • 圖片水印:即使被盜鏈,也能達到品牌曝光效果。
  • 簽名 URL(簽名過期):結合時間戳與密鑰生成帶有效期的下載連結,更安全。

總結

PHP 層面防盜鏈靈活但有效能開銷;建議結合 Web 伺服器層面規則與業務邏輯(Token/簽名 URL)雙重防護,兼顧安全與效能。

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