• ipip


    如果客户端使用了代理服务器,使用Request.ServerVariables("HTTP_X_FORWARDED_FOR") 得到IP地址,
    如果没用使用代理服务器,得到的是"",则用Request.ServerVariables("REMOTE_ADDR") 得到IP地址.

    1.REMOTE_ADDR:浏览当前页面的用户计算机的ip地址

    2.HTTP_X_FORWARDED_FOR: 浏览当前页面的用户计算机的网关

    3.HTTP_CLIENT_IP:客户端的ip

    Request.ServerVariables变量意义. http代理相关知识
    Request.ServerVariables["HTTP_VIA"]---------可以获得用户内部的ip
    Request.ServerVariables["HTTP_X_FORWARDED_FOR"]---------可以知道代理服务器的服务器名以及端口
    Request.ServerVariables["REMOTE_ADDR"]-- 发出请求的远程主机的 IP 地址。
    http代理相关知识
    关键就在HTTP_X_FORWARDED_FOR
    使用不同种类代理服务器,上面的信息会有所不同:
    一、没有使用代理服务器的情况:
    REMOTE_ADDR = 您的 IP
    HTTP_VIA = 没数值或不显示
    HTTP_X_FORWARDED_FOR = 没数值或不显示
    二、使用透明代理服务器的情况:Transparent Proxies
    REMOTE_ADDR = 代理服务器 IP
    HTTP_VIA = 代理服务器 IP
    HTTP_X_FORWARDED_FOR = 您的真实 IP
    这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。
    三、使用普通匿名代理服务器的情况:Anonymous Proxies
    REMOTE_ADDR = 代理服务器 IP
    HTTP_VIA = 代理服务器 IP
    HTTP_X_FORWARDED_FOR = 代理服务器 IP
    隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。
    四、使用欺骗性代理服务器的情况:Distorting Proxies
    REMOTE_ADDR = 代理服务器 IP
    HTTP_VIA = 代理服务器 IP
    HTTP_X_FORWARDED_FOR = 随机的 IP
    告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。
    五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)
    REMOTE_ADDR = 代理服务器 IP
    HTTP_VIA = 没数值或不显示
    HTTP_X_FORWARDED_FOR = 没数值或不显示
    在WEB开发中.我们可能都习惯使用下面的代码来获取客户端的IP地址:
     -----------------C#代码----------------------------------------------------------------------
    //优先取得代理IP
    string IP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
    if (string.IsNullOrEmpty(IP)) {
     //没有代理IP则直接取连接客户端IP
     IP = Request.ServerVariables["REMOTE_ADDR"];
    }

    -----------------------------------------------------------------------------------------------

    上面代码看来起是正常的.可惜这里却隐藏了一个隐患!!因为"HTTP_X_FORWARDED_FOR"这个值是通过获取HTTP头的"X_FORWARDED_FOR"属性取得.所以这里就提供给恶意破坏者一个办法:可以伪造IP地址!!

    下面是测试代码:
    --------------C#代码---------------------------------------------------------------------------
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://localhost/ip.aspx");
    request.Headers.Add("X_FORWARDED_FOR", "0.0.0.0");
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    StreamReader stream = new StreamReader(response.GetResponseStream());
    string IP = stream.ReadToEnd();
    stream.Close();
    response.Close();
    request = null;

    -----------------------------------------------------------------------------------------------
    "ip.aspx"文件代码:
    ------------C#代码-----------------------------------------------------------------------------
    Response.Clear();
    //优先取得代理IP
    string IP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
    if (string.IsNullOrEmpty(IP))
    {
      //没有代理IP则直接取客户端IP
      IP = Request.ServerVariables["REMOTE_ADDR"];
    }
    Response.Write(IP);
    Response.End();

    ------------------------------------------------------------------------------------------------
    这样.当测试代码中去访问ip.aspx文件时."string IP = stream.ReadToEnd();"这段代码取到的IP数据就是"0.0.0.0"!!!!(呵.在真实情况下.这样的IP地址肯定不是我们想要的结果.而在有些投票系统中限制一个IP只能投1次票时,如果也是用类似的代码取得对方IP然后再判断的话.呵呵.限制就失效咯)...

    或者如果你用上面代码获取IP地址后后面又不再进行数据判断的话也许还能更进一步进行数据破坏!!
    比如你用类似上面的代码中获取IP地址就直接有这样的SQL语句:
     string sql = "INSERT INTO (IP) VALUE ('" + IP + "')";
    那么也许破坏者还可以进行SQL注入进行数据破坏!!

    这样看来利用"HTTP_X_FORWARDED_FOR"这个属性获取客户端IP的方法就不再可取了.-_-# 但如果不用这种方法.那么那些真正使用了代理服务器的人.我们又不能再获取到他们的真实IP地址(因为某些代理服务器会在"X_FORWARDED_FOR"这个HTTP头里加上访问用户真正的IP地址).呵.现实就是这样,某种东西都有有得必有失...

  • 相关阅读:
    修改科目的字段状态组-OBC4
    采购收货-对于物料,在工厂、库存地点中不存在物料主数据
    采购收货
    新建工厂
    采购订单收货提示,T169P表不存在
    维护工厂日历
    开始创建物料没有选择会计视图,需要怎么维护
    拓端数据tecdat|R语言分布滞后线性和非线性模型(DLMs和DLNMs)分析时间序列数据
    拓端数据tecdat|R语言分布滞后非线性模型(DLNM)研究发病率,死亡率和空气污染示例
    拓端数据tecdat|R语言中实现广义相加模型GAM和普通最小二乘(OLS)回归
  • 原文地址:https://www.cnblogs.com/baicaocanhua/p/ip.html
Copyright © 2020-2023  润新知