• asp.net中获得客户端的IP地址


    因为要在项目中取到客户端IP,在网上搜了下相关资料,其中有一篇文章总结的比较详细,这里就把一些我用的上总结一下
    方便以后查阅.
     通常我们都通过下面的代码获得IP:
       string ip =System.Web.HttpContext.Current.Request.UserHostAddress;
        或 string ip =System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
    
    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"]; 
     }
    
    Request.ServerVariables["HTTP_VIA"] ,ServerVariables["HTTP_X_FORWARDED_FOR"],Request.ServerVariables["REMOTE_ADDR"]的值分下面几种情况:
    一、没有使用代理服务器的情况:
    
          REMOTE_ADDR = 用户的 IP
          HTTP_VIA = 没数值或不显示
          HTTP_X_FORWARDED_FOR = 没数值或不显示 
    二、使用透明代理服务器的情况:Transparent Proxies
    
          REMOTE_ADDR = 最后一个代理服务器 IP 
          HTTP_VIA = 代理服务器 IP
          HTTP_X_FORWARDED_FOR = 用户的真实 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
    
       这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。
    
    三、使用普通匿名代理服务器的情况: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,但是向访问对象透露了您是使用代理服务器访问他们的。 
    四、使用欺骗性代理服务器的情况: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
  • 相关阅读:
    POJ
    UML Rose2003完美破解攻略
    《转》Ubuntu14.04 openstack juno配置之 ceilometer遥測模块安装配置
    Android APK反编译就这么简单 具体解释
    Android Otto框架浅析
    ECharts:企业报表工具
    Nginx 笔记与总结(12)Nginx URL Rewrite 实例(ecshop)
    排名前20位的大数据职位及其职责,你能胜任么
    SAS市场研究应用介绍:组合/联合分析
    SAS市场研究应用介绍:组合/联合分析
  • 原文地址:https://www.cnblogs.com/xw2cc1314/p/2981849.html
Copyright © 2020-2023  润新知