说到IP获取无非是我们常见的以下几种方式,但是具体获取的值具体区别在哪?网上不乏相关文章,说的也是很详细,但是真正使用起来,还有很多不太对的地方。IP在不同系统中,应用相当广泛,常见的日志记录、广告分区域投放等。

   1:  HttpContext.Current.Request.ServerVariables["HTTP_VIA"];
   2:  HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];                
   3:  HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
   4:  HttpContext.Current.Request.ServerVariables["HTTP_CLIENT_IP"];
   5:  HttpContext.Current.Request.UserHostAddress;

针对以上五项获取IP的值其代表意思,Google一下后有人在博客中做了详情说明,其中我找了一篇发布最早的,最原始是http://www.cnblogs.com/yejun/archive/2008/02/26/1082485.html拿来参考,有多好转载这个的,然后加工了一下文章。在此我先引用一下该文章的内容便于阅读。

一、没有使用代理服务器的情况:

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欺骗它。

下面是我在真实测试结果

实验代码非常简单

   1:  <%@ Page Language="C#" %>
   2:  <!DOCTYPE html>
   3:  <script runat="server">
   4:  protected override void OnLoad(EventArgs e)
   5:  {    
   6:      lblHTTP_VIA.Text="HTTP_VIA:"+HttpContext.Current.Request.ServerVariables["HTTP_VIA"];
   7:      lblHTTP_X_FORWARDED_FOR.Text="HTTP_X_FORWARDED_FOR:"+HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];                
   8:      lblREMOTE_ADDR.Text = "REMOTE_ADDR:"+HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
   9:      lblHTTP_CLIENT_IP.Text="HTTP_CLIENT_IP:"+HttpContext.Current.Request.ServerVariables["HTTP_CLIENT_IP"];
  10:      lblUserHostAddress.Text="HttpContext.Current.Request.UserHostAddress:"+HttpContext.Current.Request.UserHostAddress;
  11:      base.OnLoad(e);
  12:  }
  13:  </script>
  14:  <head>
  15:      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  16:      <title></title>
  17:  </head>
  18:  <body>
  19:      <form id="form1" runat="server">
  20:          <asp:Label ID="lblREMOTE_ADDR" runat="server"></asp:Label><br />
  21:          <asp:Label ID="lblHTTP_VIA" runat="server"></asp:Label><br />
  22:          <asp:Label ID="lblHTTP_X_FORWARDED_FOR" runat="server"></asp:Label><br />
  23:          <asp:Label ID="lblHTTP_CLIENT_IP" runat="server"></asp:Label><br />
  24:          <asp:Label ID="lblUserHostAddress" runat="server"></asp:Label><br />
  25:      </form>
  26:  </body>
  27:  </html>

环境一 : 本地不使用代理;服务器网站不使用CDN加速;

结果一:

环境二 : 本地使用普通透明代理;服务器网站不使用CDN加速;

结果二:

环境三: 本地使用高度匿名代理;服务器网站不使用CDN加速;

结果三:

从结果二 和 结果三中证明:HTTP_VIA 的值并非代理IP,直接是空值(可见上述引用的文章描述至少不够正确),那什么时候不为空呢?请接着往下看.

环境四: 本地不使用任何代理;服务器网站通过CDN加速;

结果四:

从结果四中看到:HTTP_VIA 终于不为空了,有个域名可以得出IP,证明了该值不确定性,由本人不太了解代理服务器架构,大致猜测出 这项值应该是代理服务器自己写的值。

环境五:本地使用透明代理;服务器网站通过CDN加速;

结果五:

从环境五中 实际行成了一个 多层代理结果。这时如果通HTTP_X_FORWARDED_FOR获取IP,需要分组 取一。

环境六:本地使用高度匿名代理;服务器网站通过CDN加速;

结果六:

到此总结 结论如下:

一、Request.ServerVariables["REMOTE_ADR"]:的值始终等于 Request.UserHostAddress。

二、Request.ServerVariables["HTTP_CLIENT_IP"]:的值始终等于空。

三、Request.ServerVariables["HTTP_VIA"]:的值就是CDN商。

四、Request.ServerVariables["HTTP_X_FORWARDED_FOR"]:为代理IP,多层代理将有多个IP,最前面为原始IP。

好吧,所有结果说明一切。你需要简单获取IP,还是尽量获取原始IP,就看你怎么取值了。这里我自己走了不少弯路,所以配个环境实测一下。 欢迎指正错误。

再论 ASP.NET 中获取客户端IP地址的更多相关文章

  1. 在ASP.NET Core中获取客户端IP地址

    随着ASP.NET的发展,有不同的方式从请求中访问客户端IP地址.WebForms和MVC Web应用程序只是访问当前HTTP上下文的请求. var ip = HttpContext.Current. ...

  2. 在ASP.NET Core 2.x中获取客户端IP地址

    一.前言 大家也知道服务端请求时我们获取的IP地址是包含在请求头中,因此这也大大便利了IP的获取. 在ASP.NET中,可以通过以下方式获取客户端的IP地址. HttpContext.Current. ...

  3. ASP.NET Core获取客户端IP地址

    1.在ConfigureServices注入IHttpContextAccessor // ASP.NET Core 2.1的注入方式 //services.AddHttpContextAccesso ...

  4. vue中获取客户端IP地址(不需要额外引入三方文件)

    之前看了几种方法 ,都是引入腾讯,新浪,搜狐等的三方js文件来查询IP地址,但是我自己测试的时候IP地址不准确,所以就找了找,发现了这个方法,准确的获取到了IP地址和cmd的ipconfig获取到的I ...

  5. 集群环境下JSP中获取客户端IP地址的方法

    String ip = request.getHeader("X-Forwarded-For");if (ip == null || ip.length() == 0 || &qu ...

  6. (转)【ASP.NET开发】获取客户端IP地址 via C#

    [ASP.NET开发]获取客户端IP地址 via C# 说明:本文中的内容是我综合博客园上的博文和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己 ...

  7. 获取客户端IP地址 via C#

    获取客户端IP地址 via C# 说明:本文中的内容是我综合博客园上的博文和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己在项目中做过的事情,同 ...

  8. JAVA获取客户端IP地址

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...

  9. C# WebApi 获取客户端ip地址

    转自:http://www.cnblogs.com/weixing/p/5674078.html References required: HttpContextWrapper - System.We ...

随机推荐

  1. Android异常一、异步任务导致的窗口句柄泄漏问题(转)

    05-05 10:36:41.009: E/WindowManager(4243): Activity com.tao.MyActivity has leaked window com.android ...

  2. ASP.NET状态保持:ViewState

    ViewState是ASP.NET的.aspx页面特有的,是页面级的状态保持.一般用在内网系统和网站后台. namespace WebFormTest.TestCollect { public par ...

  3. 在HTML文件中加载js

    js加载只分为两种: 1.全局js,放在<head>标签里面,整个页面很多都用到的,它是优先加载的. 2.局部js,放在</html>结束标签以内的任何位置,它是第二加载的.

  4. DOCTYPE对$(window).height()取值的影响

    前言:公司项目需要用到一个弹框垂直居中,网上类似的垂直居中弹出层大同小异,因为项目是基于Jquery 下的,所以用$(window).height()-layer.height())/2 +$(doc ...

  5. Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException:

    七月 17, 2014 4:56:01 下午 org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service( ...

  6. mac虚拟机parallels 无法启动 "Windows 7" 虚拟机

    关机前在虚拟机上安装了个游戏有点大,第二天开机就使用不了虚拟机了: 提示:mac虚拟机parallels  无法启动 "Windows 7" 虚拟机.  释放至少 241 MB 的 ...

  7. 【转】CSS white-space 属性

    定义和用法 white-space 属性设置如何处理元素内的空白. 这个属性声明建立布局过程中如何处理元素中的空白符.值 pre-wrap 和 pre-line 是 CSS 2.1 中新增的. 默认值 ...

  8. MySQL5.7重置root密码

    版本更新 缘故,好多网上的教程都不适用了,甚至连官网的文档也不是能够顺利操作的. 如果 MySQL 正在运行,首先杀之: killall -TERM mysqld. 运行mysqld_safe --s ...

  9. AngularJs记录学习04

    <html> <head> <title>Angular JS Views</title> <script src="js/Angula ...

  10. C# 页面抓取类

    抓取网站页面的内容,简单的类应用,代码如下: /// <summary> /// 获取页面内容 /// </summary> /// <param name=" ...