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

PHP 突破 163 相簿防盜鏈:Socket 代理取圖實作

     編輯:PHP 相關知識

問題背景

網易 163 相簿對外部網站引用圖片設有 Referer 檢查,直接在 <img> 標籤使用圖片 URL 會顯示盜鏈提示。本文示範如何用 PHP Socket 模擬瀏覽器請求,代理取回圖片並輸出給前端。

核心程式碼

<?php
ob_start();
$img = $_GET['url']; // 目標圖片完整 URL

// 解析主機與路徑
$host_path = str_replace('https://', '', $img);
$host = explode('/', $host_path)[0];
$path = strstr($host_path, '/');

// 建立 Socket 連線
$fp = fsockopen($host, 80, $errno, $errstr, 30);
if ($fp) {
    // 發送偽造的 HTTP 請求標頭
    fputs($fp, "GET $path HTTP/1.1\r\n");
    fputs($fp, "Host: $host\r\n");
    fputs($fp, "Accept: */*\r\n");
    fputs($fp, "Referer: https://$host/\r\n"); // 關鍵:偽造 Referer
    fputs($fp, "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n");
    fputs($fp, "Connection: Close\r\n\r\n");

    // 讀取回應
    $content = '';
    while ($str = fread($fp, 4096)) {
        $content .= $str;
    }
    fclose($fp);

    // 分離 HTTP 標頭與圖片二進制內容
    $pos = strpos($content, "\r\n\r\n");
    $image_data = substr($content, $pos + 4);

    // 輸出圖片
    header("Content-Type: image/jpeg");
    echo $image_data;
}
?>

關鍵技術點解析

  1. Referer 偽造:163 判斷依據為 Referer 標頭,設為相簿首頁即可通過。
  2. User-Agent 模擬:部分防盜鏈會檢查 UA,模擬常見瀏覽器降低被擋風險。
  3. 二進制資料處理:fread 讀取原始回應,需手動切割 HTTP Header 與 Body。
  4. Content-Type 輸出:確保瀏覽器正確識別為圖片而非文字。

使用方式

將上述程式碼存為 proxy_img.php,前端調用:

<img src="proxy_img.php?url=https://photo.163.com/xxx/xxx.jpg" />

法律與道德提醒

  • 此技術僅供學習 HTTP 協議與 Socket 程式設計之用。
  • 繞過防盜鏈可能違反服務條款,請勿用於商業盜用頻寬或侵犯版權圖片。
  • 建議自建圖床或使用授權 CDN 服務。

進階優化方向

  • 加入本地快取(如 Redis、檔案快取)減少重複請求。
  • 支援 HTTPS(需改用 ssl:// 協議與 443 埠)。
  • 錯誤處理與超時重試機制。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved