取ip

  • 3806
  • 0

摘要:取ip

(以下文章皆為引用~ 非本人所寫,為記錄用~ 要引用請選擇使用文章底部網址)

在 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

 

 

---------------

c#寫法

 

在我們產品既有的程式中,有一段程式碼會去取得Client端的IP,主要用途是與ID一起作為識別使用者之用,因為為了方便使用者使用,我們的系統是允許不同使用者使用相同的帳號登入的,因此我們多加了IP這個key作為識別兩個同樣帳號的使用者,而以前程式的寫法是這樣:

1 string tClientIP = Request.ServerVariables["REMOTE_ADDR"].ToString();

過去在使用時都沒有遇到什麼問題,結果在近期卻發生在不同電腦上使用的兩個使用者,系統記錄到的IP竟然是相同的,這也導致兩個使用相同ID登入的使用者,彼此之間的使用者資訊會互相覆蓋,真是個大問題,上網查了一下發現,如果client端有設定代理伺服器的話,Request.ServerVariables["REMOTE_ADDR"]取到的會是代理伺服器的IP,這時候我們可以透過以下的程式判斷是否有代理伺服器:

1 Request.ServerVariables["HTTP_VIA"].ToString();

有設定代理伺服器的話,我們可以透過以下的語法取得Client真正的IP:

1 Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();

如果沒有設定代理伺服器的話以上兩個內容值是空白的,以上資訊參考自:http://neural.cs.nthu.edu.tw/jang/books/webprog/06asp/request.asp?SessionCount=4

另外這邊有篇很比較深入的研究:http://hi.baidu.com/singsue/blog/item/febfb5af7214f4c97dd92a3c.html

 

 

---------------

引用自

vb
http://www.dotblogs.com.tw/jameswu/archive/2008/04/22/3042.aspx

c#
http://www.dotblogs.com.tw/jimmyyu/archive/2009/05/21/8493.aspx