再论 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,就看你怎么取值了。这里我自己走了不少弯路,所以配个环境实测一下。 欢迎指正错误。
再论 ASP.NET 中获取客户端IP地址的更多相关文章
- 在ASP.NET Core中获取客户端IP地址
随着ASP.NET的发展,有不同的方式从请求中访问客户端IP地址.WebForms和MVC Web应用程序只是访问当前HTTP上下文的请求. var ip = HttpContext.Current. ...
- 在ASP.NET Core 2.x中获取客户端IP地址
一.前言 大家也知道服务端请求时我们获取的IP地址是包含在请求头中,因此这也大大便利了IP的获取. 在ASP.NET中,可以通过以下方式获取客户端的IP地址. HttpContext.Current. ...
- ASP.NET Core获取客户端IP地址
1.在ConfigureServices注入IHttpContextAccessor // ASP.NET Core 2.1的注入方式 //services.AddHttpContextAccesso ...
- vue中获取客户端IP地址(不需要额外引入三方文件)
之前看了几种方法 ,都是引入腾讯,新浪,搜狐等的三方js文件来查询IP地址,但是我自己测试的时候IP地址不准确,所以就找了找,发现了这个方法,准确的获取到了IP地址和cmd的ipconfig获取到的I ...
- 集群环境下JSP中获取客户端IP地址的方法
String ip = request.getHeader("X-Forwarded-For");if (ip == null || ip.length() == 0 || &qu ...
- (转)【ASP.NET开发】获取客户端IP地址 via C#
[ASP.NET开发]获取客户端IP地址 via C# 说明:本文中的内容是我综合博客园上的博文和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己 ...
- 获取客户端IP地址 via C#
获取客户端IP地址 via C# 说明:本文中的内容是我综合博客园上的博文和MSDN讨论区的资料,再通过自己的实际测试而得来,属于自己原创的内容说实话很少,写这一篇是为了记录自己在项目中做过的事情,同 ...
- JAVA获取客户端IP地址
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...
- C# WebApi 获取客户端ip地址
转自:http://www.cnblogs.com/weixing/p/5674078.html References required: HttpContextWrapper - System.We ...
随机推荐
- JSON对象遍历方法
JSON对象提前不知道其属性和结构,遍历其值 var json2 = { "name": "txt1", "name2": "tx ...
- 破解source insignt方法
source insignt版本:官网3.5版本 方法:在桌面建立一个文本文档,将下面内容拷贝进去,保存为.reg文件(注意拓展名问题,自己设置),然后双击即可. win7 64bit Window ...
- POJ C++程序设计 编程题#2 编程作业—多态与虚函数
编程题#2 来源: POJ(Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 下面程序的输出结果 ...
- project 2010 使用技巧
快捷键 设置任务子任务 ALT+SHIFT+向右方向键 1.工作时间设置 新建一个日历后,可以在 “项目 >> 项目信息 >> 日历” 中进行选择
- CentOS配置FTP(VSFTPD)
一.vsftp安装篇 # 安装vsftpd yum -y install vsftpd # 启动 service vsftpd start # 开启启动 chkconfig vsftpd on 二.v ...
- PHP字符串拼接与MySQL语句
这个部分总是钻牛角尖.总是出错. public function getList($pagesize=25){ $where = '1'; $tableName = $this->getTabl ...
- Linux安全运维日志排查几个 tips
运维日志排查记录 前言 记录一些排查常见日志的命令,方法wiki,欢迎补充(Markdown 语法). 常用命令 查找关键词并统计行数 cat 2015_7_25_test_access.log | ...
- php验证手机号码
大家都应该有这个常识,中国的手机号码都是以数字“1”开头,然后利用“0~9”10个数字组成的11位数字组合,那么我们的验证规则肯定要根据这个思路来写. 根据上面的简单思路,我们便可以写下以下的验证代码 ...
- linux C socket
socket套接字和管道同样可以提供进程内通信.但套接字更胜一筹,不同的进程可以跨越不同的主机(说白了,支持网络通信).使用套接字的知名程序:telnet.rlogin.ftp等. 你需要知道的一些基 ...
- 窗体皮肤实现 - 实现简单Toolbar(六)
自定义皮肤很方便,基础开发的工作也是很大的.不过还好一般产品真正需要开发的并不是很多.现在比较漂亮的界面产品都会有个大大的工具条. Toolbar工具条实现皮肤的方法还是可以使用Form的处理方案.每 ...