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

简介: 原文:再论 ASP.NET 中获取客户端IP地址 说到IP获取无非是我们常见的以下几种方式,但是具体获取的值具体区别在哪?网上不乏相关文章,说的也是很详细,但是真正使用起来,还有很多不太对的地方。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欺骗它。

下面是我在真实测试结果

实验代码非常简单  

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="123.aspx.cs" Inherits="Learun.Application.Web._123" %>

<!DOCTYPE html>
<script runat="server">
    protected override void OnLoad(EventArgs e)
    {

        lblHTTP_VIA.Text = "HTTP_VIA:" + HttpContext.Current.Request.ServerVariables["HTTP_VIA"];
        lblHTTP_X_FORWARDED_FOR.Text = "HTTP_X_FORWARDED_FOR:" + HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
        lblREMOTE_ADDR.Text = "REMOTE_ADDR:" + HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
        lblHTTP_CLIENT_IP.Text = "HTTP_CLIENT_IP:" + HttpContext.Current.Request.ServerVariables["HTTP_CLIENT_IP"];
        lblUserHostAddress.Text = "HttpContext.Current.Request.UserHostAddress:" + HttpContext.Current.Request.UserHostAddress;
        base.OnLoad(e);
    }
</script>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:Label ID="lblREMOTE_ADDR" runat="server"></asp:Label><br />
        <asp:Label ID="lblHTTP_VIA" runat="server"></asp:Label><br />
        <asp:Label ID="lblHTTP_X_FORWARDED_FOR" runat="server"></asp:Label><br />
        <asp:Label ID="lblHTTP_CLIENT_IP" runat="server"></asp:Label><br />
        <asp:Label ID="lblUserHostAddress" runat="server"></asp:Label><br />
    </form>
</body>
</html>

 

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

结果一:getIP1

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

结果二:getIP2

 

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

结果三:getIP3

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

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

结果四:getIP4

 

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

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

结果五:getIP5

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

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

结果六:getIP6

到此总结 结论如下:

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

目录
相关文章
|
3月前
|
前端开发
.net core mvc获取IP地址和IP所在地(其实是百度的)
.net core mvc获取IP地址和IP所在地(其实是百度的)
123 0
|
9月前
|
开发框架 前端开发 JavaScript
ASP.NET Core MVC 从入门到精通之wwwroot和客户端库
ASP.NET Core MVC 从入门到精通之wwwroot和客户端库
157 0
|
10月前
|
存储 Linux
如何通过/proc/net/fib_trie获取ip地址
如何通过/proc/net/fib_trie获取ip地址
190 0
|
.NET 开发框架
IIS&ASP.NET 站点IP跳转到域名
前言:先到微软的 https://www.iis.net/downloads/microsoft/url-rewrite  下载URL Rewrite 目标:输入ip跳转到域名所在的网站 比如58的115.
1670 0
【.Net MF网络开发板研究-01】IP地址设定及简单web演示
在物联网时代,具备网络功能才是王道。新开发板除了具备以太网模块以外,还增加了USB Host模块,当然还增加了其它相关接口
755 0
|
.NET
在ASP.NET Core 2.x中获取客户端IP地址
一、前言 大家也知道服务端请求时我们获取的IP地址是包含在请求头中,因此这也大大便利了IP的获取。 在ASP.NET中,可以通过以下方式获取客户端的IP地址。 HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] 但这不适用于ASP.NET Core 2.0。
1901 0
|
.NET 中间件 应用服务中间件
|
.NET API 数据库
win10 uwp 使用 asp dotnet core 做图床服务器客户端
原文 win10 uwp 使用 asp dotnet core 做图床服务器客户端 本文告诉大家如何在 UWP 做客户端和 asp dotnet core 做服务器端来做一个图床工具   服务器端 从 win10 uwp 手把手教你使用 asp dotnet core 做 cs 程序 可以了解一个简单的 asp dotnet core 程序是如何搭建,下面来告诉搭建如何做一个简单的图床服务器 注意本文提供的方式不能用在正式的项目,只能在自己玩的项目使用。
994 0
|
.NET 应用服务中间件 Linux