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中文網其他相關文章!