在WEB開(kāi)發(fā)中.我們可能都習慣使用下面的代碼來(lái)獲取客戶(hù)端的IP地址:
-----------------C#代碼----------------------------------------------------------------------
//優(yōu)先取得代理IP
string IP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(IP)) {
//沒(méi)有代理IP則直接取連接客戶(hù)端IP
IP = Request.ServerVariables["REMOTE_ADDR"];
} -----------------------------------------------------------------------------------------------
上面代碼看來(lái)起是正常的.可惜這里卻隱藏了一個(gè)隱患!!因為"HTTP_X_FORWARDED_FOR"這個(gè)值是通過(guò)獲取HTTP頭的"X_FORWARDED_FOR"屬性取得.所以這里就提供給惡意破壞者一個(gè)辦法:可以偽造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();
//優(yōu)先取得代理IP
string IP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(IP))
{
//沒(méi)有代理IP則直接取客戶(hù)端IP
IP = Request.ServerVariables["REMOTE_ADDR"];
}
Response.Write(IP);
Response.End(); ------------------------------------------------------------------------------------------------
這樣.當測試代碼中去訪(fǎng)問(wèn)ip.aspx文件時(shí)
."string IP = stream.ReadToEnd();"這段代碼取到的IP數據就是"
0.0.0.0"!!!!(呵.在真實(shí)情況下.這樣的IP地址肯定不是我們想要的結果.而在有些投票系統中限制一個(gè)IP只能投1次票時(shí),如果也是用類(lèi)似的代碼取得對方IP然后再判斷的話(huà).呵呵.限制就失效咯)...
或者如果你用上面代碼獲取IP地址后后面又不再進(jìn)行數據判斷的話(huà)也許還能更進(jìn)一步進(jìn)行數據破壞!!
比如你用類(lèi)似上面的代碼中獲取IP地址就直接有這樣的SQL語(yǔ)句:
string sql = "INSERT INTO (IP) VALUE ('" + IP + "')";
那么也許破壞者還可以進(jìn)行SQL注入進(jìn)行數據破壞!!
這樣看來(lái)利用"HTTP_X_FORWARDED_FOR"這個(gè)屬性獲取客戶(hù)端IP的方法就不再可取了.-_-# 但如果不用這種方法.那么那些真正使用了代理服務(wù)器的人.我們又不能再獲取到他們的真實(shí)IP地址(因為某些代理服務(wù)器會(huì )在"X_FORWARDED_FOR"這個(gè)HTTP頭里加上訪(fǎng)問(wèn)用戶(hù)真正的IP地址).呵.現實(shí)就是這樣,某種東西都有有得必有失...
最后,我的建議是不要再使用上面的方法去獲取客戶(hù)端IP.即是不要再理會(huì )
代理情況.你的建議又是怎樣呢???