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

PHP 中偽造 HTTP_REFERER 的正確姿勢:XMLHTTP 失效原因與 Socket 替代方案

     編輯:PHP 相關知識

問題背景

嘗試使用 VBScript 的 MSXML2.XMLHTTP 組件偽造 Referer 頭訪問 PHP 頁面,卻發現 $_SERVER['HTTP_REFERER'] 始終為空(顯示 "no referer")。網上流傳的 ASP/VBS 代碼經測試均無效。

深度排查

1. 網上代碼驗證

常見代碼片段:

Set http = CreateObject("MSXML2.XMLHTTP")
http.open "GET", "https://target.com/referer.php", False
http.setRequestHeader "Referer", "https://fake.com"
http.send
WScript.Echo http.responseText

實測無效。即使在 IIS+ASP 環境下測試,結果相同。

2. 根因分析

經查證並獲可靠來源確認:在 ASP 和 AJAX 環境中,無法通過設置 Header 來修改 Referer。這是組件層面的安全限制,並非代碼錯誤。

解決方案:底層 Socket 實現

既然高層組件受限,改用 Winsock 組件 手動構造 HTTP 請求報文,完全控制 Header 字段。

核心思路

  1. 建立 TCP 連接至目標服務器 80 端口。
  2. 手動發送符合 HTTP/1.1 規範的請求報文,包含自定義 Referer 頭。
  3. 接收並解析響應。

關鍵代碼邏輯 (VBScript)

Dim sock, request, response
Set sock = CreateObject("MSWinsock.Winsock")
sock.RemoteHost = "target.com"
sock.RemotePort = 80
sock.Connect

' 等待連接完成 (需事件驅動或輪詢)
' ...

' 構造完整 HTTP 請求
request = "GET /referer.php HTTP/1.1" & vbCrLf & _
          "Host: target.com" & vbCrLf & _
          "Referer: https://fake.com" & vbCrLf & _
          "Connection: Close" & vbCrLf & vbCrLf

sock.SendData request

' 接收數據 (DataArrival 事件中處理)
' response = response & sock.GetData(...)

注意事項

  • 並非所有系統預裝 Winsock 組件 (MSWinsock.Winsock),可能需分發 mswinsck.ocx 並註冊。
  • 需處理異步事件 (Connect, DataArrival, Close),代碼結構較 XMLHTTP 復雜。
  • 需手動處理 Chunked 編碼、Gzip 解壓、重定向等 HTTP 細節。

總結

建議:若非必須在 VBS/ASP 老舊環境下操作,強烈建議改用 PHP cURL、Python 或 Node.js 等現代工具偽造 Header,穩定性與維護性遠超 Socket 手寫方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案可行性優點缺點
MSXML2.XMLHTTP / WinHttp❌ 失效簡單組件強制忽略自定義 Referer
Winsock (Raw Socket)✅ 可行完全控制報文依賴 OCX;需手寫協議解析;易出錯
PHP cURL / Python Requests✅ 推薦跨平台;功能完善;無組件依賴需在支持的語言環境運行