軟體開發的天空


SINCE 2004

最新回應

在 ASP.NET 中使用 Request.ServerVariables("REMOTE_ADDR") 來取得客戶端(Client)的IP地址,但如果客戶端是使用代理伺服器時,那取到的就是代理伺服器的 IP 位址,而不是真正的客戶端 IP 位址。要想透過代理伺服器取得客戶端的真實IP地址,就要使用Request.ServerVariables ("HTTP_X_FORWARDED_FOR") 來讀取。不過要注意的,並不是每個代理伺服器都能用Request.ServerVariables("HTTP_X_FORWARDED_FOR") 來讀取客戶端的真實 IP,有些用此方法讀取到的仍然是代理伺服器的IP。另外需要注意的是:如果客戶端沒有透過代理伺服器時,那麼用 Request.ServerVariables ("HTTP_X_FORWARDED_FOR") 取到的值將是空的。因此,如果要在程式中使用這個方法,可以使用類似下面程式片段來處理:

Dim ClientIP As String = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
IF ClientIP = String.Empty Then
 ClientIP = Request.ServerVariables("REMOTE_ADDR")
End IF


也就是說,如果客戶端透過代理伺服器時,我們所取到的是 HTTP_X_FORWARDED_FOR 值,如果沒透過代理伺服器,就會取到REMOTE_ADDR 的值。

'下面筆者就使用一個函式來展示如何取得遠端使用者的 IP 位址。程式的邏輯為,如果不能取客戶端真實 IP,就會取客戶端的代理IP。
Private Function GetClientIP()
    Dim strIPAddr As Atring
    If Request.ServerVariables("HTTP_X_FORWARDED_FOR") = "" OR InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), "unknown") > 0 Then
        strIPAddr = Request.ServerVariables("REMOTE_ADDR")
    ElseIf InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ",") > 0 Then
        strIPAddr = Mid(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), 1, InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ",")-1)
    ElseIf InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ";") > 0 Then
        strIPAddr = Mid(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), 1, InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ";")-1)
    Else
        strIPAddr = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
    End If
    Return Mid(strIPAddr, 1, 30).Trim
End Function


回應

  • pan 2008/9/18 下午 03:23 回覆

    # re: ASP.NET 程式如何取得客戶端真實 IP Address

    您好 ~ 請教~ 如何把這個 Function 放在 App_Code 裡~ 做為 Shared Function ~
    Request 這個字 ~ 會出現下列錯誤

    "沒有類別的明確執行個體,因此無法從共用方法或共用成員初始設定式中參考至類別的執行個體成員。"

*標  題:

*姓  名:

  電子郵件: (將不會被顯示)

  個人網頁:

*回應

登入後使用進階評論

Please add 4 and 8 and type the answer here: