直接使用 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")
<%
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,取第一段;部分設備使用分號分隔。HTTP_X_FORWARDED_FOR 與 REMOTE_ADDR 的 IPv6 格式。// 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 等自訂標頭,需依據基礎設施調整取值邏輯。