2009年4月21日 星期二

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

在 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

沒有留言:

張貼留言