高防IP如何获取客户端真实IP地址
  • admin
  • 群英帮助betway88w
  • 2020-12-30 14:25:44

这篇文章主要介绍了关于PHP、Java获取客户端真实IP地址的方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下�


仅适用于网站类转发规则


经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR 、X-Real-IP信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址�


先说说这些请求头的意�

X-Forwarded-For

这是一� Squid 开发的字段,只有在通过了HTTP代理或者负载均衡服务器时才会添加该项�

格式为X-Forwarded-For:client1,proxy1,proxy2,一般情况下,第一个ip为客户端真实ip,后面的为经过的代理服务器ip。现在大部分的代理都会加上这个请求头�

X-Real-IP

nginx代理一般会加上此请求头�


php获取客户端IP地方法如�

1、REMOTE_ADDR


2、HTTP_X_FORWARDED_FOR


3�HTTP_CLIENT_IP


4�HTTP_X_REAL_IP

REMOTE_ADDR 是你的客户端跟你的服务器“握手”时候的IP。如果使用了“匿名代理”,REMOTE_ADDR将显示代理服务器的IP�


HTTP_CLIENT_IP 是代理服务器发送的HTTP头。如果是“超级匿名代理”,则返回none值。同样,REMOTE_ADDR也会被替换为这个代理服务器的IP�

$_SERVER['REMOTE_ADDR']; //访问端(有可能是用户,有可能是代理的)IP
$_SERVER['HTTP_X_FORWARDED_FOR']; //用户是在哪个IP使用的代理(有可能存在,也可以伪�

$_SERVER['HTTP_CLIENT_IP']; //代理端的(有可能存在,可伪造)



一、没有使用代理服务器的情况:
REMOTE_ADDR = 您的 IP
HTTP_X_FORWARDED_FOR = 没数值或不显�


二、使用代理服务器的情�

REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_X_FORWARDED_FOR = 您的真实 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215�


获取客户端真实的IP地址实例�

/**
 * 获取客户端ip
 */    
 function getClientIP() {
     $ip = "unknown";
     /*
      * 访问时用localhost访问的,读出来的是�::1”是正常情况�
      * ::1说明开启了ipv6支持,这是ipv6下的本地回环地址的表示�
      * 使用ip地址访问或者关闭ipv6支持都可以不显示这个�
      * */
    if (isset($_SERVER)) {
        if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
            $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
        } elseif (isset($_SERVER["HTTP_X_REAL_IP"])) {
            $ip = $_SERVER["HTTP_X_REAL_IP"];
        } elseif (isset($_SERVER["HTTP_CLIENT_ip"])) {
            $ip = $_SERVER["HTTP_CLIENT_ip"];
        } else {
            $ip = $_SERVER["REMOTE_ADDR"];
        }
    } else {
        if (getenv('HTTP_X_FORWARDED_FOR')) {
            $ip = getenv('HTTP_X_FORWARDED_FOR');
        } elseif (getenv('HTTP_X_REAL_IP')) {
            $ip = getenv('HTTP_X_REAL_IP');
        } elseif (getenv('HTTP_CLIENT_ip')) {
            $ip = getenv('HTTP_CLIENT_ip');
        } else {
            $ip = getenv('REMOTE_ADDR');
        }
    }
    if(trim($ip)=="::1"){
        $ip="127.0.0.1";
    }
    return $ip; 
}




				

Java获取客户端真实IP地址方法


在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了�


下面是一个参考获取客户端IP地址的方法:
public String getClientIP(HttpServletRequest request) { 
    String ip = request.getHeader("x-forwarded-for"); 
    if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
        ip = request.getHeader("Proxy-Client-IP"); 
    } 
    if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
        ip = request.getHeader("WL-Proxy-Client-IP"); 
 
    } 
    if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
        ip = request.getRemoteAddr(); 
    } 
    return ip; 
} 


成为群英会员,开启智能安全云计算之旅

立即注册
专业资深工程师驻�
7X24小时快速响�
一站式无忧技术支�
免费备案服务
免费拨打 400-678-4567
免费拨打 400-678-4567 免费拨打 400-678-4567 � 0668-2555555
在线客服
微信公众号
返回顶部
返回顶部 返回顶部