1. 程式人生 > >php獲取真實ip地址原理及實現

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)

// 獲取IP地址(摘自discuz)
function getIp(){
    $ip='未知IP';
    if(!empty($_SERVER['HTTP_CLIENT_IP'])){
        return is_ip($_SERVER['HTTP_CLIENT_IP'])?$_SERVER['HTTP_CLIENT_IP']:$ip;
    }elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
        return is_ip($_SERVER['HTTP_X_FORWARDED_FOR'])?$_SERVER['HTTP_X_FORWARDED_FOR'
]:$ip; }else{ return is_ip($_SERVER['REMOTE_ADDR'])?$_SERVER['REMOTE_ADDR']:$ip; } } function is_ip($str){ $ip=explode('.',$str); for($i=0;$i<count($ip);$i++){ if($ip[$i]>255){ return false; } } return preg_match('/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/'
,$str); }
下面我附上我的原始碼:

<?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;
}
echo get_real_ip();
?>