专栏首页逸鹏说道再论 ASP.NET 中获取客户端IP地址

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

说到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,就看你怎么取值了。这里我自己走了不少弯路,所以配个环境实测一下。 欢迎指正错误。

实验代码非常简单

本文分享自微信公众号 - 我为Net狂(dotNetCrazy)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-03-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 现在无法开始异步操作。异步操作只能在异步处理程序或模块中开始,或在页生存期中的特定事件过程中开始

    异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 这篇没啥技术含量,用来小记一番 错误信息 ...

    逸鹏
  • 反向代理和负载均衡有何区别?

    反向代理,是把一些静态资源存储在服务器上,当用户有请求的时候,就直接返回反向代理服务器上的资源给用户,而如果反向代理服务器上没有的资源,就转发给后面的负载均衡服...

    逸鹏
  • 端午漫谈(附:Ubuntu18.04下轻量截图软件)

    有空就陪陪家人吧。今天陪外公吃了顿饭,陪老人家聊了会天,颇有点感触。发现技术真的是改变生活,小孩抖音自学跳舞,大人微信刷又刷,很多天海一方的老朋友都可以联系到了...

    逸鹏
  • 你真的了解127.0.0.1和0.0.0.0吗~

    事出有因,前段时间老大让小姐姐在测试环境搭建一个ELK。我说我搭好了,但Kibana端口不知为啥没暴露出去,其他机子访问不了我的Kibana但确可以ping通这...

    范蠡
  • 【RL-TCPnet网络教程】第27章 DNS域名系统基础知识

    本章节为大家讲解DNS(Domain Name System,域名系统),通过前面章节对TCP和UDP的学习,需要大家对DNS也有个基础的认识。

    armfly
  • 【前端纯干货】原来TinyPNG可以这样玩!

    前端er,又称为切图仔,平时经常需要用PSD导出PNG或JPG,但是导出来的的图片一般比较大,往往需要用一些其他工具压缩后再发布到生产环境。

    JowayYoung
  • java 网络通信协议 (三次握手+协议的概述+TCP+UDP+IP)

    首先我们先来了解两种软件协议: 1 c/s结构:全称Client/Server结构,是指客户端与服务器的结构,就像qq,微信等软件,通过客户端与服务器交互

    一只胡说八道的猴子
  • Scrapy使用随机IP代理插件Scrapy-Proxies

    使用Scrapy_Proxies随机IP代理插件 https://github.com/aivarsk/scrapy-proxies ---- 安装: pip...

    SeanCheney
  • 006 | 我是如何写作的

    今天再免费放出一篇专栏文章,因为我想推荐更多人开始写作。另外,多点下文后的广告吧,就当是给我的稿费。

    Keegan小钢
  • 快速学习-XXL-JOB调度中心/执行器 RESTful API

    针对Java应用,可以直接通过官方提供的调度中心与执行器,方便快速的接入和使用调度中心,可以参考上文 “快速入门” 章节。

    cwl_java

扫码关注云+社区

领取腾讯云代金券