前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >再论 ASP.NET 中获取客户端IP地址

再论 ASP.NET 中获取客户端IP地址

作者头像
逸鹏
发布2018-04-11 14:25:14
4K0
发布2018-04-11 14:25:14
举报
文章被收录于专栏:逸鹏说道

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

代码语言:javascript
复制
   1:  HttpContext.Current.Request.ServerVariables["HTTP_VIA"];
代码语言:javascript
复制
   2:  HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];                
代码语言:javascript
复制
   3:  HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
代码语言:javascript
复制
   4:  HttpContext.Current.Request.ServerVariables["HTTP_CLIENT_IP"];
代码语言:javascript
复制
   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欺骗它。

实验代码非常简单

代码语言:javascript
复制
   1:  <%@ Page Language="C#" %>
代码语言:javascript
复制
   2:  <!DOCTYPE html>
代码语言:javascript
复制
   3:  <script runat="server">
代码语言:javascript
复制
   4:  protected override void OnLoad(EventArgs e)
代码语言:javascript
复制
   5:  {    
代码语言:javascript
复制
   6:      lblHTTP_VIA.Text="HTTP_VIA:"+HttpContext.Current.Request.ServerVariables["HTTP_VIA"];
代码语言:javascript
复制
   7:      lblHTTP_X_FORWARDED_FOR.Text="HTTP_X_FORWARDED_FOR:"+HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];                
代码语言:javascript
复制
   8:      lblREMOTE_ADDR.Text = "REMOTE_ADDR:"+HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
代码语言:javascript
复制
   9:      lblHTTP_CLIENT_IP.Text="HTTP_CLIENT_IP:"+HttpContext.Current.Request.ServerVariables["HTTP_CLIENT_IP"];
代码语言:javascript
复制
  10:      lblUserHostAddress.Text="HttpContext.Current.Request.UserHostAddress:"+HttpContext.Current.Request.UserHostAddress;
代码语言:javascript
复制
  11:      base.OnLoad(e);
代码语言:javascript
复制
  12:  }
代码语言:javascript
复制
  13:  </script>
代码语言:javascript
复制
  14:  <head>
代码语言:javascript
复制
  15:      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
代码语言:javascript
复制
  16:      <title></title>
代码语言:javascript
复制
  17:  </head>
代码语言:javascript
复制
  18:  <body>
代码语言:javascript
复制
  19:      <form id="form1" runat="server">
代码语言:javascript
复制
  20:          <asp:Label ID="lblREMOTE_ADDR" runat="server"></asp:Label><br />
代码语言:javascript
复制
  21:          <asp:Label ID="lblHTTP_VIA" runat="server"></asp:Label><br />
代码语言:javascript
复制
  22:          <asp:Label ID="lblHTTP_X_FORWARDED_FOR" runat="server"></asp:Label><br />
代码语言:javascript
复制
  23:          <asp:Label ID="lblHTTP_CLIENT_IP" runat="server"></asp:Label><br />
代码语言:javascript
复制
  24:          <asp:Label ID="lblUserHostAddress" runat="server"></asp:Label><br />
代码语言:javascript
复制
  25:      </form>
代码语言:javascript
复制
  26:  </body>
代码语言:javascript
复制
  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,就看你怎么取值了。这里我自己走了不少弯路,所以配个环境实测一下。 欢迎指正错误。

实验代码非常简单

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我为Net狂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
内容分发网络 CDN
内容分发网络(Content Delivery Network,CDN)通过将站点内容发布至遍布全球的海量加速节点,使其用户可就近获取所需内容,避免因网络拥堵、跨运营商、跨地域、跨境等因素带来的网络不稳定、访问延迟高等问题,有效提升下载速度、降低响应时间,提供流畅的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档