首頁  >  文章  >  後端開發  >  php如何取得客戶端真實IP位址

php如何取得客戶端真實IP位址

伊谢尔伦
伊谢尔伦原創
2016-11-26 14:14:231022瀏覽

在PHP取得客戶端IP中常使用 $_SERVER["REMOTE_ADDR"] 。但如果客戶端是使用代理伺服器來訪問,那麼取到的是代理伺服器的 IP 位址,而不是真正的客戶端 IP 位址。若想透過代理伺服器取得客戶端的真實 IP 位址,就要使用 $_SERVER["HTTP_X_FORWARDED_FOR"] 來讀取。

但只有客戶端使用「透明代理」的情況下,$_SERVER["HTTP_X_FORWARDED_FOR"] 的值才是客戶端真正的IP(如果是多層代理,該值可能是由客戶端真正IP和多個代理伺服器的IP組成,由逗號「,」分隔),而在「匿名代理」、「欺騙性代理」的情況下是代理伺服器的IP值(如果是多層代理,該值可能由多個代理伺服器的IP組成,由逗號“,”分隔),在“高匿名代理”的情況下是空值。

關於HTTP頭資訊中的REMOTE_ADDR、HTTP_FORWARDED_FOR值,我們在下文中有詳細的介紹,假設客戶端真實IP是221.5.252.160:

一、沒有使用代理伺服器的PHPDR = 客戶端IP

HTTP_X_FORWARDED_FOR = 沒數值或不顯示

二、使用透明代理伺服器的情況:Transparent Proxies

REMOTE_ADDR = 最後一個代理伺服器一個真實代理伺服器,這個值類似:221.5.252.160, 203.98.182.163, 203.129.72.215)

這類代理伺服器還是將客戶端真實的IP發送給了訪問對象,無法達到隱藏真實身份的目的。

三、使用普通匿名代理伺服器的PHP取得客戶端IP情況:Anonymous Proxies

REMOTE_ADDR = 最後一個代理伺服器IP

HTTP_X_FORWARDED_FOR = 代理伺服器IP (經過多個代理伺服器時,這個值類似:203. , 203.98.182.163, 203.129.72.215)

這種情況下隱藏了客戶端的真實IP,但是向訪問對象透露了客戶端是使用代理伺服器訪問它們的。

四、使用欺騙性代理伺服器的情況:Distorting Proxies

REMOTE_ADDR = 代理伺服器IP

HTTP_X_FORWARDED_FOR = 隨機的IP(經過多個代理伺服器時,這個值類似:220.4.251.1583. 72.215)

這種情況下同樣透露了客戶端是使用了代理伺服器,但編造了一個虛假的隨機IP(220.4.251.159)代替客戶端的真實IP來欺騙它。

五、使用高匿名代理伺服器的PHP取得客戶端IP情況:High Anonymity Proxies (Elite proxies)

REMOTE_ADDR = 代理伺服器IP

HTTP_X_FORWARDED_FOR = 代理伺服器IP

HTTP_X_FORWARDED_FOR = 代理伺服器IP

HTTP_X_FORWARDED_FOR = 代理伺服器IP

HTTP_X_FORWARDED_FOR = 代理伺服器IP

HTTP_X_FORWARDED_FOR = 代理伺服器IP

HTTP_X_FORWARDED_FOR = 代理伺服器IP

HTTP_X_FORWARDED_FOR = 代理伺服器IP🎜🎜HTTP_X_FORWARD、FOR =訊息未必能夠取得到,因為不同的瀏覽器不同的網路設備可能會傳送不同的IP頭訊息。因此PHP使用$_SERVER["REMOTE_ADDR"] 、$_SERVER["HTTP_X_FORWARDED_FOR"] 取得的值可能是空值也可能是「unknown」值。 🎜🎜因此,使用PHP取得客戶端IP的程式碼可以如下:🎜
function getip() {  
    $unknown = 'unknown';  
    if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) 
        && $_SERVER['HTTP_X_FORWARDED_FOR'] 
        && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], $unknown) 
    ) {  
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];  
    } elseif ( isset($_SERVER['REMOTE_ADDR']) 
        && $_SERVER['REMOTE_ADDR'] && 
        strcasecmp($_SERVER['REMOTE_ADDR'], $unknown) ) 
    {  
        $ip = $_SERVER['REMOTE_ADDR'];  
    }  
    /**  
     * 处理多层代理的情况  
     * 或者使用正则方式:$ip = preg_match("/[\d\.]
     * {7,15}/", $ip, $matches) ? $matches[0] : $unknown;  
     */  
    if (false !== strpos($ip, ','))  
        $ip = reset(explode(',', $ip));  
    return $ip;  
}
🎜🎜🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn