利用HTTP_X_FORWARDED_FOR獲取客戶端IP(http代理的相關知識)

Request.ServerVariables變量意義. http代理相關知識
Request.ServerVariables["HTTP_VIA"]---------能夠得到用戶內部的ip
Request.ServerVariables["HTTP_X_FORWARDED_FOR"]---------能夠知道代理服務器的服務器名以及端口
Request.ServerVariables["REMOTE_ADDR"]-- 發出請求的遠程主機的 IP 地址。
http代理相關知識
關鍵就在HTTP_X_FORWARDED_FOR
使用不一樣種類代理服務器,上面的信息會有所不一樣:
1、沒有使用代理服務器的狀況:
REMOTE_ADDR = 您的 IP
HTTP_VIA = 沒數值或不顯示
HTTP_X_FORWARDED_FOR = 沒數值或不顯示
2、使用透明代理服務器的狀況:Transparent Proxies
REMOTE_ADDR = 代理服務器 IP
HTTP_VIA = 代理服務器 IP
HTTP_X_FORWARDED_FOR = 您的真實 IP
這類代理服務器仍是將您的信息轉發給您的訪問對象,沒法達到隱藏真實身份的目的。
3、使用普通匿名代理服務器的狀況:Anonymous Proxies
REMOTE_ADDR = 代理服務器 IP
HTTP_VIA = 代理服務器 IP
HTTP_X_FORWARDED_FOR = 代理服務器 IP
隱藏了您的真實IP,可是向訪問對象透露了您是使用代理服務器訪問他們的。
4、使用欺騙性代理服務器的狀況:Distorting Proxies
REMOTE_ADDR = 代理服務器 IP
HTTP_VIA = 代理服務器 IP
HTTP_X_FORWARDED_FOR = 隨機的 IP
告訴了訪問對象您使用了代理服務器,但編造了一個虛假的隨機IP代替您的真實IP欺騙它。
5、使用高匿名代理服務器的狀況:High Anonymity Proxies (Elite proxies)
REMOTE_ADDR = 代理服務器 IP
HTTP_VIA = 沒數值或不顯示
HTTP_X_FORWARDED_FOR = 沒數值或不顯示 
在WEB開發中.咱們可能都習慣使用下面的代碼來獲取客戶端的IP地址:
 -----------------C#代碼---------------------------------------------------------------------- 
//優先取得代理IP 
string IP = Request.ServerVariables["HTTP_X_FORWARDED_FOR" ]; 
if (string.IsNullOrEmpty(IP)) 
{
 
//沒有代理IP則直接取鏈接客戶端IP 

 IP = Request.ServerVariables["REMOTE_ADDR"]; 
}
 

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

上面代碼看來起是正常的.惋惜這裏卻隱藏了一個隱患!!由於"HTTP_X_FORWARDED_FOR"這個值是經過獲取HTTP頭的"X_FORWARDED_FOR"屬性取得.因此這裏就提供給惡意破壞者一個辦法:能夠僞造IP地址!! 

下面是測試代碼: 
--------------C#代碼--------------------------------------------------------------------------- 
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://localhost/ip.aspx" ); 
request.Headers.Add(
"X_FORWARDED_FOR""0.0.0.0"
); 
HttpWebResponse response 
=
 (HttpWebResponse)request.GetResponse(); 
StreamReader stream 
= new
 StreamReader(response.GetResponseStream()); 
string IP =
 stream.ReadToEnd(); 
stream.Close(); 
response.Close(); 
request 
= null

----------------------------------------------------------------------------------------------- 
"ip.aspx"文件代碼: 
------------C#代碼----------------------------------------------------------------------------- 
Response.Clear(); 
//優先取得代理IP 

string IP = Request.ServerVariables["HTTP_X_FORWARDED_FOR" ]; 
if (string
.IsNullOrEmpty(IP))

  
//沒有代理IP則直接取客戶端IP 

  IP = Request.ServerVariables["REMOTE_ADDR"]; 
}
 
Response.Write(IP); 
Response.End(); 

------------------------------------------------------------------------------------------------ 
這樣.當測試代碼中去訪問ip.aspx文件時."string IP = stream.ReadToEnd();"這段代碼取到的IP數據就是"0.0.0.0"!!!!(呵.在真實狀況下.這樣的IP地址確定不是咱們想要的結果.而在有些投票系統中限制一個IP只能投1次票時,若是也是用相似的代碼取得對方IP而後再判斷的話.呵呵.限制就失效咯)... 

或者若是你用上面代碼獲取IP地址後後面又再也不進行數據判斷的話也許還能更進一步進行數據破壞!!
好比你用相似上面的代碼中獲取IP地址就直接有這樣的SQL語句:
 
string sql = "INSERT INTO (IP) VALUE ('" + IP + "')"; 那麼也許破壞者還能夠進行SQL注入進行數據破壞!! 這樣看來利用"HTTP_X_FORWARDED_FOR"這個屬性獲取客戶端IP的方法就再也不可取了.-_-# 但若是不用這種方法.那麼那些真正使用了代理服務器的人.咱們又不能再獲取到他們的真實IP地址(由於某些代理服務器會在"X_FORWARDED_FOR"這個HTTP頭裏加上訪問用戶真正的IP地址).呵.現實就是這樣,某種東西都有有得必有失... 
相關文章
相關標籤/搜索