天天看點

擷取用戶端IP位址PHP獲得真實用戶端的真實IP REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR

PHP中$_SERVER參數HTTP_X_FORWARDED_FOR &REMOTE_ADDR與擷取IP

在PHP 中使用 $_SERVER["REMOTE_ADDR"] 來取得用戶端的 IP位址,但如果用戶端是使用代理伺服器來通路,那取到的就

是代理伺服器的 IP 位址,而不是真正的用戶端 IP 位址。要想透過代理伺服器取得用戶端的真實 IP 位址,就要使用

$_SERVER["HTTP_X_FORWARDED_FOR"] 來讀取。

不過要注意的事,并不是每個代理伺服器都能用 $_SERVER["HTTP_X_FORWARDED_FOR"] 來讀取用戶端的真實IP,有些用此

方法讀取到的仍然是代理伺服器的 IP。

還有一點需要注意的是:如果用戶端沒有通過代理伺服器來通路,那麼用$_SERVER["HTTP_X_FORWARDED_FOR"]取到的值将

是空的。是以,如果要在程式中使用此方法,可以這樣處理:

<?php

if ($_SERVER["HTTP_X_FORWARDED_FOR"]=="")

{

$user_ip=$_SERVER["REMOTE_ADDR"];

}

else

$user_ip=$_SERVER["HTTP_X_FORWARDED_FOR"];

?>

即:如果用戶端通過代理伺服器,則取 HTTP_X_FORWARDED_FOR 的值,如果沒通過代理伺服器,就取REMOTE_ADDR 的值。

一下内容來自另一篇博文,講述的比較細緻。

PHP獲得真實用戶端的真實IP REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR

REMOTE_ADDR 是你的用戶端跟你的伺服器“握手”時候的IP。如果使用了“匿名代理”,REMOTE_ADDR将顯示代理伺服器的IP。

HTTP_CLIENT_IP 是代理伺服器發送的HTTP頭。如果是“超級匿名代理”,則傳回none值。同樣,REMOTE_ADDR也會被替換為這個代理伺服器的IP。

$_SERVER['REMOTE_ADDR']; //通路端(有可能是使用者,有可能是代理的)IP

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

$_SERVER['HTTP_X_FORWARDED_FOR']; //使用者是在哪個IP使用的代理(有可能存在,也可以僞造)

三個值差別如下:

一、沒有使用代理伺服器的情況:

REMOTE_ADDR = 您的 IP

HTTP_VIA = 沒數值或不顯示

HTTP_X_FORWARDED_FOR = 沒數值或不顯示

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

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

HTTP_VIA = 代理伺服器 IP

HTTP_X_FORWARDED_FOR = 您的真實 IP ,經過多個代理伺服器時,這個值類似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

這類代理伺服器還是将您的資訊轉發給您的通路對象,無法達到隐藏真實身份的目的。

三、使用普通匿名代理伺服器的情況:Anonymous Proxies

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

HTTP_VIA = 代理伺服器 IP

HTTP_X_FORWARDED_FOR = 代理伺服器 IP ,經過多個代理伺服器時,這個值類似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

隐藏了您的真實IP,但是向通路對象透露了您是使用代理伺服器通路他們的。

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

REMOTE_ADDR = 代理伺服器 IP

HTTP_VIA = 代理伺服器 IP

HTTP_X_FORWARDED_FOR = 随機的 IP ,經過多個代理伺服器時,這個值類似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

告訴了通路對象您使用了代理伺服器,但編造了一個虛假的随機IP代替您的真實IP欺騙它。

五、使用高匿名代理伺服器的情況:High Anonymity Proxies (Elite proxies)

REMOTE_ADDR = 代理伺服器 IP

HTTP_VIA = 沒數值或不顯示

HTTP_X_FORWARDED_FOR = 沒數值或不顯示 ,經過多個代理伺服器時,這個值類似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

完全用代理伺服器的資訊替代了您的所有資訊,就象您就是完全使用那台代理伺服器直接通路對象。

//擷取使用者IP

$ip = '';

foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_FROM', 'REMOTE_ADDR') as $v) {

   if (isset($_SERVER[$v])) {

       if (! preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/', $_SERVER[$v])) {

                continue;

   } 

          $ip = $_SERVER[$v];

   }

}

uset($ip,$v);