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

ASP 獲取用戶真實 IP 地址:穿透代理的完整方案

     編輯:ASP 相關知識

直接使用 Request.ServerVariables("REMOTE_ADDR") 只能取得直接連線的 IP,若用戶經由代理伺服器,將取得代理 IP 而非真實客戶端 IP。正確做法需檢查 HTTP_X_FORWARDED_FOR 標頭,並處理多重代理、異常值等情況。

基本邏輯

userip = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
If userip = "" Then userip = Request.ServerVariables("REMOTE_ADDR")

健壯版 GetIP 函數

<%
Private Function GetIP()
    Dim strIPAddr, xff
    xff = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
    
    ' 無 XFF 或含 unknown 視為直連
    If xff = "" Or InStr(xff, "unknown") > 0 Then
        strIPAddr = Request.ServerVariables("REMOTE_ADDR")
    ' 多重代理以逗號或分號分隔,取第一個(最原始客戶端)
    ElseIf InStr(xff, ",") > 0 Then
        strIPAddr = Mid(xff, 1, InStr(xff, ",") - 1)
    ElseIf InStr(xff, ";") > 0 Then
        strIPAddr = Mid(xff, 1, InStr(xff, ";") - 1)
    Else
        strIPAddr = xff
    End If
    
    GetIP = Trim(Mid(strIPAddr, 1, 30)) ' 防超長攻擊
End Function

ip = GetIP()
Response.Write "客戶端 IP:" & ip
%>

進階防護細節

  • 標頭偽造風險:X-Forwarded-For 可被客戶端竄改,不可直接用於權限控制,僅供統計、日誌參考。
  • 多層代理格式:標準格式為 client, proxy1, proxy2,取第一段;部分設備使用分號分隔。
  • IPv6 支援:現代環境建議同時解析 HTTP_X_FORWARDED_FOR 與 REMOTE_ADDR 的 IPv6 格式。

ASP.NET 對照參考

// 1. 直連 IP
HttpContext.Current.Request.UserHostAddress;
// 2. 伺服器變數
HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
// 3. 穿透代理(同理需驗證)
HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

部署建議

若網站部署於負載平衡器或 CDN 之後(如 Cloudflare、AWS ALB),真實 IP 通常在 CF-Connecting-IP、X-Real-IP 等自訂標頭,需依據基礎設施調整取值邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved