php获取真实ip地址原理及实现

1、HTTP_X_FORWARDED_FOR 是用户到达最终访问地时经过的路径访问点(包括自身和使用的多层代理)的IP列表。依然取决于代理的设置,可通过http头伪造

2、HTTP_CLIENT_IP 是代理服务器设置发送的HTTP头,代表你的客户端的真实IP。当然,人家可以选择设置与否以及设置成什么样。可通过http头伪造

3、REMOTE_ADDR 是你的客户端跟服务器“握手”时候的IP。如果使用代理,REMOTE_ADDR将显示代理服务器的IP。可能是用户真实IP也可能是代理IP

获取ip地址的两个方法:

1.超级全局变量$_SERVER['']

2getenv()函数获取环境变量的值。(注意这个函数不支持IIS下的php)


下面是对应的函数:


function get_real_ip(){

if(getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknow")){

$ip = getenv("HTTP_CLIENT_IP");

}else if(getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknow")){

$ip = getenv("HTTP_X_FORWARDED_FOR");

}else if(getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknow")){

$ip = getenv("REMOTE_ADDR");

}else if(isset($_SERVER["REMOTE_ADDR"]) && $_SERVER["REMOTE_ADDR"] && strcasecmp($_SERVER["REMOTE_ADDR"],"unknow")){

$ip = $_SERVER["REMOTE_ADDR"];

}else{

$ip = "unknow";

}

return $ip;

}


function get_real_ip()

{

    $arr_ip_header = array(

        'HTTP_CDN_SRC_IP',

        'HTTP_PROXY_CLIENT_IP',

        'HTTP_WL_PROXY_CLIENT_IP',

        'HTTP_CLIENT_IP',

        'HTTP_X_FORWARDED_FOR',

        'REMOTE_ADDR',

    );

    $client_ip = 'unknown';

    foreach ($arr_ip_header as $key)

{

        if (!empty($_SERVER[$key]) && strtolower($_SERVER[$key]) != 'unknown')

{

            $client_ip = $_SERVER[$key];

            break;

        }

}

    return $client_ip;

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容