方便之后查阅.
一般咱们都经过下面的代码得到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