方便之後查閱.
一般咱們都經過下面的代碼得到IP:
string ip =System.Web.HttpContext.Current.Request.UserHostAddress;
或 string ip =System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];html
REMOTE_ADDR 說明:安全
訪問客戶端的 IP 地址。
此項信息用戶不能夠修改。
若是真的給改了的話,你也和服務器鏈接不了了,服務器就是按照這個來與客戶端創建鏈接並進行通信的。實際我測試修改這個 ServerVariables , 一點效果都沒有。仍然得到是實際的值。
但若是用戶使用了代理服務器,上述代碼得到的是代理服務器的IP地址;若是用戶使用了多個代理服務器,則是到達服務器的最後一個代理服務器的IP地址。
如何繞過代理服務器得到用戶真實的IP地址呢?服務器
private static string getIp()
{
if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null)
return System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(new char[] { ',' })[0];
else
return System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}post
Request.ServerVariables["HTTP_VIA"] ,ServerVariables["HTTP_X_FORWARDED_FOR"],Request.ServerVariables["REMOTE_ADDR"]的值分下面幾種狀況:測試
1、沒有使用代理服務器的狀況:spa
REMOTE_ADDR = 用戶的 IP
HTTP_VIA = 沒數值或不顯示
HTTP_X_FORWARDED_FOR = 沒數值或不顯示 代理
2、使用透明代理服務器的狀況:Transparent Proxiescode
REMOTE_ADDR = 最後一個代理服務器 IP
HTTP_VIA = 代理服務器 IP
HTTP_X_FORWARDED_FOR = 用戶的真實 IP ,通過多個代理服務器時,這個值相似以下:203.98.182.163, 203.98.182.163, 203.129.72.215。htm
這類代理服務器仍是將您的信息轉發給您的訪問對象,沒法達到隱藏真實身份的目的。
對象
3、使用普通匿名代理服務器的狀況:Anonymous Proxies
REMOTE_ADDR = 最後一個代理服務器 IP
HTTP_VIA = 代理服務器 IP
HTTP_X_FORWARDED_FOR = 代理服務器 IP ,通過多個代理服務器時,這個值相似以下:203.98.182.163, 203.98.182.163, 203.129.72.215。
隱藏了您的真實IP,可是向訪問對象透露了您是使用代理服務器訪問他們的。
4、使用欺騙性代理服務器的狀況:Distorting Proxies
REMOTE_ADDR = 代理服務器 IP
HTTP_VIA = 代理服務器 IP
HTTP_X_FORWARDED_FOR = 隨機的 IP ,通過多個代理服務器時,這個值相似以下:203.98.182.163, 203.98.182.163, 203.129.72.215。
告訴了訪問對象您使用了代理服務器,但編造了一個虛假的隨機IP代替您的真實IP欺騙它。
因此getIp()也不是最好的,由於能夠編造一個假的IP,具體作法去看http://www.cnblogs.com/kingthy/archive/2007/11/24/970783.html
總結:
"Request.UserHostAddress"是可信的.可是這樣的話卻又獲取不了那些已使用了代理服務器的用戶真實IP地址(由於在這時Request.UserHostAddress獲取到的就是這代理服務器的IP)..
getIp()又有安全隱患
具體怎麼作就要看本身選擇了.
參考資料:
http://blog.joycode.com/ghj/archive/2008/02/20/114827.aspx
http://www.cnblogs.com/kingthy/archive/2007/11/24/970783.html