Asp.Net 獲取客戶端真實IP方法總結


#需求場景

在項目中經常要記錄審計日誌,日誌中藥包含客戶端的真實IP,那麼如何獲取客戶端真實IP呢?

#HTTP協議頭: REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR

#簡單瞭解

在討論獲取客戶端IP 地址前,我們首先下弄明白的是以下三個的具體含義:
REMOTE_ADDR 是你的客戶端跟你的服務器“握手”時候的IP;
HTTP_CLIENT_IP 是代理服務器發送的HTTP頭。
X-Forwarded-For:簡稱XFF頭,它代表客戶端,也就是HTTP的請求端真實的IP,只有在通過了HTTP 代理(服務器時纔會添加該項。它不是RFC中定義的標準請求頭信息。標準格式如下:X-Forwarded-For: client1, proxy1, proxy2。

Request.Headers["REMOTE_ADDR"];//訪問端(有可能是用戶,有可能是代理的)IP
Request.Headers["HTTP_CLIENT_IP"];//代理端的(有可能存在,可僞造)
Request.Headers["HTTP_X_FORWARDED_FOR"];//用戶是在哪個IP使用的代理(有可能存在,也可以僞造)

#具體情況分析

1、沒有使用代理服務器的情況:

REMOTE_ADDR = 您的 IP
HTTP_CLIENT_IP = 沒數值或不顯示
HTTP_X_FORWARDED_FOR = 沒數值或不顯示

2、使用透明代理服務器的情況:Transparent Proxies

REMOTE_ADDR = 最後一個代理服務器 IP
HTTP_CLIENT_IP = 代理服務器 IP
HTTP_X_FORWARDED_FOR = 您的真實 IP ,經過多個代理服務器時,這個值類似如下:201.98.101.101, 301.98.201.201, 301.98.201.202。
這類代理服務器還是將您的信息轉發給您的訪問對象,無法達到隱藏真實身份的目的。

3、使用普通匿名代理服務器的情況:Anonymous Proxies

REMOTE_ADDR = 最後一個代理服務器 IP
HTTP_CLIENT_IP = 代理服務器 IP
HTTP_X_FORWARDED_FOR = 代理服務器 IP ,經過多個代理服務器時,這個值類似如下:301.98.201.201, 301.98.201.202, 301.98.201.203。
隱藏了您的真實IP,但是向訪問對象透露了您是使用代理服務器訪問他們的。

4、使用欺騙性代理服務器的情況:Distorting Proxies

REMOTE_ADDR = 代理服務器 IP
HTTP_CLIENT_IP = 代理服務器 IP
HTTP_X_FORWARDED_FOR = 隨機的 IP ,經過多個代理服務器時,這個值類似如下:111.111.111.111,301.98.201.201, 301.98.201.202,。
告訴了訪問對象您使用了代理服務器,但編造了一個虛假的隨機IP代替您的真實IP欺騙它。

5、使用高匿名代理服務器的情況:High Anonymity Proxies (Elite proxies)

REMOTE_ADDR = 代理服務器 IP
HTTP_CLIENT_IP = 沒數值或不顯示
HTTP_X_FORWARDED_FOR = 沒數值或不顯示 ,經過多個代理服務器時,這個值類似如下:301.98.201.201, 301.98.201.202, 301.98.201.203。
完全用代理服務器的信息替代了您的所有信息,就象您就是完全使用那臺代理服務器直接訪問對象。

#Asp.Net獲取用戶真實IP方法

    private static string GetClientIP(HttpContext context)
    {
        string result = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
        if (string.IsNullOrEmpty(result))
        {
            result = context.Request.ServerVariables["REMOTE_ADDR"];
        }
        return result;
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章