嘗試使用 VBScript 的 MSXML2.XMLHTTP 組件偽造 Referer 頭訪問 PHP 頁面,卻發現 $_SERVER['HTTP_REFERER'] 始終為空(顯示 "no referer")。網上流傳的 ASP/VBS 代碼經測試均無效。
常見代碼片段:
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 環境下測試,結果相同。
經查證並獲可靠來源確認:在 ASP 和 AJAX 環境中,無法通過設置 Header 來修改 Referer。這是組件層面的安全限制,並非代碼錯誤。
既然高層組件受限,改用 Winsock 組件 手動構造 HTTP 請求報文,完全控制 Header 字段。
Referer 頭。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(...)
MSWinsock.Winsock),可能需分發 mswinsck.ocx 並註冊。Connect, DataArrival, Close),代碼結構較 XMLHTTP 復雜。| 方案 | 可行性 | 優點 | 缺點 |
|---|---|---|---|
| MSXML2.XMLHTTP / WinHttp | ❌ 失效 | 簡單 | 組件強制忽略自定義 Referer |
| Winsock (Raw Socket) | ✅ 可行 | 完全控制報文 | 依賴 OCX;需手寫協議解析;易出錯 |
| PHP cURL / Python Requests | ✅ 推薦 | 跨平台;功能完善;無組件依賴 | 需在支持的語言環境運行 |