HTTP Referer 是請求頭字段,告訴服務器請求來源頁面 URL。常用於統計來源、防盜鏈判斷。拼寫錯誤(Referer vs Referrer)已成標準。
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://target.com/image.jpg',
CURLOPT_REFERER => 'https://allowed.com/page.html', // 偽造來源
CURLOPT_RETURNTRANSFER => true,
]);
$img = curl_exec($ch);
curl_close($ch);
$fp = fsockopen('target.com', 80, $errno, $errstr, 30);
if ($fp) {
$out = "GET /image.jpg HTTP/1.1\r\n";
$out .= "Host: target.com\r\n";
$out .= "Referer: https://allowed.com/\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) echo fgets($fp, 128);
fclose($fp);
}
Privoxy 規則:{+hide-referrer{forge}} .target.com 自動將 Referer 偽造為目標 URL。
SetEnvIfNoCase Referer "^https://www.allowed.com/" local_ref
SetEnvIf Referer "^$" local_ref # 允許直接訪問(無Referer)
<FilesMatch "\.(gif|jpg|png)$">
Order Deny,Allow
Deny from all
Allow from env=local_ref
</FilesMatch>
location ~* \.(gif|jpg|png)$ {
valid_referers none blocked *.allowed.com allowed.com;
if ($invalid_referer) {
return 403; # 或重定向到默認圖片
}
}
/img/photo.jpg?sign=xxx&expire=timestamp,服務端驗證簽名與時間。Referer 只能阻擋「不懂技術的直接外鏈」,無法防止有意繞過的采集。生產環境請採用 簽名 URL + 對象存儲防盜鏈 組合方案。