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

Java 設定 Referer Header 破解圖片防盜鏈下載實作

     編輯:關於JSP

應用場景

許多網站對圖片資源啟用「防盜鏈」:僅允許自家域名的 Referer 請求下載圖片。若直接用 new URL(imgUrl).openStream() 抓取,伺服器會返回 403 Forbidden。解決之道是在 HTTP 請求中偽裝 Referer 與 Host 標頭,模擬瀏覽器行為。

核心實作代碼

package cn.searchphoto.util;

import java.io.*;
import java.net.*;
import java.util.zip.GZIPInputStream;

public class ImageDownloader {

    /**
     * 下載遠端圖片至本地檔案
     * @param imgUrl 圖片完整 URL
     * @param destFile 目標檔案物件
     * @return 成功返回檔案,失敗返回 null
     */
    public static File download(String imgUrl, File destFile) {
        try {
            URL url = new URL(imgUrl);
            URLConnection conn = url.openConnection();

            // 1. 解析 Host:從 URL 第 7 字元(略過 https://)到第一個 '/' 為止
            int hostEnd = imgUrl.indexOf('/', 7);
            String host = (hostEnd == -1) ? imgUrl.substring(7) : imgUrl.substring(7, hostEnd);
            conn.setRequestProperty("Host", host);

            // 2. 關鍵:設定 Referer 為圖片頁面 URL(通常即圖片本身或其所在頁面)
            conn.setRequestProperty("Referer", imgUrl);

            // 3. 模擬瀏覽器 User-Agent,部分站點會檢查
            conn.setRequestProperty("User-Agent",
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");

            // 4. 處理 GZIP 壓縮回應
            InputStream is = conn.getInputStream();
            String encoding = conn.getContentEncoding();
            if (encoding != null && encoding.equalsIgnoreCase("gzip")) {
                is = new GZIPInputStream(is);
            }

            // 5. 流式寫入檔案
            try (OutputStream os = new FileOutputStream(destFile)) {
                byte[] buffer = new byte[4096];
                int len;
                while ((len = is.read(buffer)) != -1) {
                    os.write(buffer, 0, len);
                }
            } finally {
                try { is.close(); } catch (Exception ignore) {}
            }
            return destFile;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

關鍵技術點解析

  1. Host Header:虛擬主機環境下,伺服器依 Host 標頭判斷對應站點;錯誤的 Host 會導致 400/404。
  2. Referer Header:防盜鏈核心校驗欄位,設為圖片所在頁面 URL 可通過大多數簡易防盜鏈。
  3. GZIP 解壓:部分 CDN 回應啟用 gzip,若不解壓直接寫入會產生損壞檔案。
  4. 流式處理:使用 4KB 緩衝區,避免大圖載入記憶體導致 OOM。

進階防禦與法律風險提示

  • 部分站點採用 簽名 URL(帶時間戳、Token)、Cookie 驗證、IP 限流 等進階手段,單純設 Referer 可能失效。
  • 法律合規:大量抓取他站資源可能違反《計算機信息網絡國際聯網管理暫行規定》及網站服務條款,建議僅用於合法授權、個人學習或已獲授權的專案。
  • 生產環境建議加入 重試機制、限流、錯誤記錄,並考慮使用 HttpClient 或 OkHttp 等成熟庫替代原生 URLConnection。

測試範例

public static void main(String[] args) {
    File out = new File("D:/temp/test.jpg");
    boolean ok = ImageDownloader.download(
        "https://example.com/images/photo.jpg", out) != null;
    System.out.println("下載" + (ok ? "成功" : "失敗") + ",檔案大小:" + out.length() + " bytes");
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved