zoukankan      html  css  js  c++  java
  • C#获取客户端IP地址

    客户端ip:
    Request.ServerVariables.Get("Remote_Addr").ToString();
    客户端主机名:
    Request.ServerVariables.Get("Remote_Host").ToString();
    客户端浏览器IE:
    Request.Browser.Browser;
    客户端浏览器 版本号:
    Request.Browser.MajorVersion;//
    客户端操作系统:
    Request.Browser.Platform;

    服务器ip:
    Request.ServerVariables.Get("Local_Addr").ToString();
    服务器名:
    Request.ServerVariables.Get("Server_Name").ToString();

    如果你想进一步了解ServerVariables,可以用
        foreach(String o in Request.ServerVariables){
         Response.Write(o+"="+Request.ServerVariables[o]+"<br>");
        }


    对于了解代理服务器情况的人,我们会知道,如果用户使用了代理服务器,上述代码获得的是代理服务器的IP地址;如果用户使用了多个代理服务器,则是到达服务器的最后一个代理服务器的IP地址。


    REMOTE_ADDR 说明:

    访问客户端的 IP 地址。
    此项信息用户不可以修改。
    如果真的给改了的话,你也和服务器连接不了了,服务器就是按照这个来与客户端建立连接并进行通讯的。实际我测试修改这个 ServerVariables , 一点效果都没有。仍然获得是实际的值。
    另: Request.UserHostAddress 和 Request.ServerVariables["REMOTE_ADDR"] 实际是同一个值。


    如何绕过代理服务器获得用户真实的IP地址呢? 这时候我们一般是类似如下的代码(这里我简单起见,没有作一些边界判断)

    private static string getIp(){if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null)return System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(new char[]{','})[0];elsereturn System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];}
    这样就足够了么? 这样是有问题的,HTTP_X_FORWARDED_FOR 、HTTP_VIA 是可以被冒名的。如果正好这里有SQL注入问题的话,那可非常严重了。


    下面我们就来具体看HTTP_VIA 和HTTP_X_FORWARDED_FOR 这两个 ServerVariables。

    HTTP_VIA

    如果有该条信息, 就证明您使用了代理服务器,代理服务器的地址就是后面的数值。

    HTTP_X_FORWARDED_FOR

    如果有该条信息, 也证明了您使用了代理服务器代理服务器的地址就是后面的数值。

    需要注意的,HTTP_X_FORWARDED_FOR 的值,并不一定是只有一个IP地址,下面的信息也是可能的,每行一条记录。下面数据取材于CSDN 实际的数据。
    10.194.73.11
    unknown, unknown, 211.100.22.30
    203.98.182.163, 203.98.182.163, 203.129.72.215
    172.16.20.110, 202.116.64.196, 203.81.21.61
    10.194.75.83, 10.194.73.11, 10.194.73.11, unknown
    192.168.120.57, unknown, unknown, 211.10.10.195
    10.2.4.211, 219.141.250.3
    3.242.165.168, 218.108.22.164
    unknown, 211.100.22.30

  • 相关阅读:
    Tomcat多域名及二级域名的配置
    Java 分割字符串
    Java 判断字符串是否为数字(浮点类型也包括)
    MySQL 判断某字段是否包含中文或字母字符的方法
    Java List排序,分组等操作
    Java 遍历List或Map集合的4种方式
    spring quartz注解任务执行两次解决方案
    java 获取当前时间精确到毫秒 格式化
    Java 方法返回多种类型
    Tomcat 设置直接通过域名访问项目(不需要接 /项目名)
  • 原文地址:https://www.cnblogs.com/qqhfeng/p/7097995.html
Copyright © 2011-2022 走看看