盜鏈會消耗伺服器頻寬且損害站長利益。本文介紹 PHP 端防盜鏈的核心思路,並提供三種不同層級的實作範例:簡單 Referer 檢查、下載頁面 Token 驗證、伺服器層面配置建議。
$key = 'sdkfjwojf32413'(放在公共配置檔)。$certcode = '84615354'(每次不同)。$certcode、$key 生成 MD5:$codekey = md5($id . $certcode . $key)。file.php?id=5&codekey=ksfjwofsdkfsf。$certcode 存入 Session。file.php 驗證 codekey 是否匹配,成功則刪除 Session、讀取檔案內容輸出(而非直接導向檔案 URL),失敗則跳轉錯誤頁。此機制確保:下載連結一次性、不可預測、必須經過自家下載頁面。
<?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
<?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('盜鏈被攔截');
}
// ... 後續輸出檔案內容
?>
mod_rewrite、ISAPI_Rewrite 或 Nginx valid_referers 指令,效能優於 PHP 層。PHP 層面防盜鏈靈活但有效能開銷;建議結合 Web 伺服器層面規則與業務邏輯(Token/簽名 URL)雙重防護,兼顧安全與效能。