PHP 獲取客戶端ip地址
一、如果沒有使用代理伺服器,
REMOTE_ADDR
= 客戶端IP HTTP_X_FORWARDED_FOR
= 沒數值或不顯示
$ip = $_SERVER['REMOTE_ADDR'];
二、使用透明代理,
REMOTE_ADDR
= 最後一個代理伺服器 IP HTTP_X_FORWARDED_FOR
= 客戶端真實 IP (經過多個代理伺服器時,這個值類似:221.5.252.160, 203.98.182.163, 203.129.72.215)
這類代理還會將客戶真實ip傳送到請求物件,無法隱藏真實ip。
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
三、使用普通匿名代理伺服器,
REMOTE_ADDR
= 最後一個代理伺服器 IP HTTP_X_FORWARDED_FOR
= 代理伺服器 IP (經過多個代理伺服器時,這個值類似:203.98.182.163, 203.98.182.163, 203.129.72.215)
這樣就隱藏了客戶端的真實ip,但伺服器會知道客戶端是通過代理伺服器去訪問的。
四、使用欺騙性代理伺服器,
REMOTE_ADDR
= 代理伺服器 IP HTTP_X_FORWARDED_FOR
= 隨機的 IP(經過多個代理伺服器時,這個值類似:220.4.251.159, 203.98.182.163, 203.129.72.215)
伺服器可以識別到時通過代理伺服器訪問的,但傳送給目標伺服器的是虛假ip。
五、使用高匿名代理,
REMOTE_ADDR
= 代理伺服器 IP HTTP_X_FORWARDED_FOR
= 沒數值或不顯示
使用這種代理時,不同瀏覽器不同裝置會返回不同的ip頭資訊,因此PHP使用$_SERVER["REMOTE_ADDR"]
、$_SERVER["HTTP_X_FORWARDED_FOR"]
獲取的值可能是空值也可能是“unknown
”值。
PHP獲取ip程式碼如下:
public function ip() { //strcasecmp 比較兩個字元,不區分大小寫。返回0,>0,<0。 if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { $ip = getenv('HTTP_CLIENT_IP'); } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { $ip = getenv('HTTP_X_FORWARDED_FOR'); } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) { $ip = getenv('REMOTE_ADDR'); } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) { $ip = $_SERVER['REMOTE_ADDR']; } $res = preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : ''; echo $res; //dump(phpinfo());//所有PHP配置資訊 }
自己寫的 獲取ip同時 正則驗證(可參考):
function getIp() { if (@$_SERVER['HTTP_CLIENT_IP'] && $_SERVER['HTTP_CLIENT_IP'] != 'unknown') { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (@$_SERVER['HTTP_X_FORWARDED_FOR'] && $_SERVER['HTTP_X_FORWARDED_FOR'] != 'unknown') { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip = $_SERVER['REMOTE_ADDR']; } return preg_match('/^\d[\d.]+\d$/', $ip) ? $ip : ''; }
然後進行ip註冊時間與手機號註冊時間間隔做判斷: