[轉貼] 取得正確的Client端IP

2012100109:05
出處:http://www.dotblogs.com.tw/jimmyyu/archive/2009/05/21/8493.aspx

在我們產品既有的程式中,有一段程式碼會去取得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