#需求場景
在項目中經常要記錄審計日志,日志中葯包含客戶端的真實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;
}