2014年9月23日 星期二

取得正確的Client端IP





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


         string clientIP = GetClientIP();

        /// 
        /// 取得正確的Client端IP
        /// 
        /// 
        protected string GetClientIP()
        {
            //判所client端是否有設定代理伺服器
            if (Request.ServerVariables["HTTP_VIA"] == null)   
                return Request.ServerVariables["REMOTE_ADDR"].ToString();
            else
                return Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();  
        }

        private static string RetrieveIP(HttpRequest request)
        {
            string ip = request.ServerVariables["HTTP_X_FORWARDED_FOR"];
            if (ip == null || ip.Trim() == string.Empty)
            {
                ip = request.ServerVariables["REMOTE_ADDR"];
            }
            return ip;
        }



沒有留言: