(转)asp.net中得到客户端的IP地址

 

由于要在项目中取到客户端IP,在网上搜了下相关资料,其中有一篇文章总结的比较详细,这里就把一些我用的上总结一下

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

相关文章
相关标签/搜索