使用PHP來取得客戶端和服務端IP

王林
發布: 2023-04-07 07:44:01
轉載
5705 人瀏覽過

1、php取得客戶端IP

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

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

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使用的代理(有可能存在,也可以偽造),有標準定義,用來識別經過HTTP代理後的客戶端IP位址,格式: clientip,proxy1,proxy2。詳細解釋請見 http://zh.wikipedia.org/wiki/X-Forwarded-For。

三個值差異如下:

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

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, 定义一个函数getIP()
function getClientIP(){
if (getenv("HTTP_CLIENT_IP")) {
	$ip = getenv("HTTP_CLIENT_IP");
}elseif(getenv("HTTP_X_FORWARDED_FOR")) {
	$ip = getenv("HTTP_X_FORWARDED_FOR");
}elseif(getenv("REMOTE_ADDR")) {
$ip = getenv("REMOTE_ADDR");
	else $ip = "Unknow";
}
return $ip;
}
或者
function getClientIp() {
	$ip = 'unknow';
    foreach (array(
                'HTTP_CLIENT_IP',
                'HTTP_X_FORWARDED_FOR',
                'HTTP_X_FORWARDED',
                'HTTP_X_CLUSTER_CLIENT_IP',
                'HTTP_FORWARDED_FOR',
                'HTTP_FORWARDED',
                'REMOTE_ADDR') as $key) {
        if (array_key_exists($key, $_SERVER)) {
            foreach (explode(',', $_SERVER[$key]) as $ip) {
                $ip = trim($ip);
                //会过滤掉保留地址和私有地址段的IP,例如 127.0.0.1会被过滤
                //也可以修改成正则验证IP
                if ((bool) filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
                    return $ip;
                }
            }
        }
    }
    return $ip;
}
登入後複製

2.php取得伺服器端IP

伺服器端IP相關的變數
a. $_SERVER[" SERVER_NAME"],需要使用函數gethostbyname()來取得。這個變數無論在伺服器端或客戶端均能正確顯示。

b. $_SERVER["SERVER_ADDR"],在伺服器端測試:127.0.0.1(這個與httpd.conf中BindAddress的設定值相關)。在客戶端測試結果正確。

/**
* 获取服务器端IP地址
 * @return string
 */
function getServerIp() { 
    if (isset($_SERVER)) { 
        if($_SERVER['SERVER_ADDR']) {
            $server_ip = $_SERVER['SERVER_ADDR']; 
        } else { 
            $server_ip = $_SERVER['LOCAL_ADDR']; 
        } 
    } else { 
        $server_ip = getenv('SERVER_ADDR');
    } 
    return $server_ip; 
}
或者
function getServerIP(){    
    return gethostbyname($_SERVER["SERVER_NAME"]);    
}
登入後複製

更多相關問題請上PHP中文網相關問題教學:https://www.php.cn/

#

以上是使用PHP來取得客戶端和服務端IP的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
php
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板