使用PHP擷取使用者用戶端真實IP的解決方案

來源:互聯網
上載者:User

擷取用戶端ip其實不是個簡單的活兒,因為存在Ip欺騙,和代理問題,所以擷取用戶端的IP的真實性會打折扣的,不能百分百準確.但是我們還是盡量找一個比較完善的擷取用戶端真正ip方法.使用php擷取IP的方法能找到很多.

function getIp(){   if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))       $ip = getenv("HTTP_CLIENT_IP");   else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))       $ip = getenv("HTTP_X_FORWARDED_FOR");  else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))       $ip = getenv("REMOTE_ADDR");  else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))           $ip = $_SERVER['REMOTE_ADDR'];       else           $ip = "unknown";       return($ip);

現在需要對這段代碼進行解釋,這裡用到了兩個函數,getenv()和strcasecmp(),前一個函數擷取得系統的環境變數,如果能取到值,則返回該值,不能則返回false.

$_SERVER是伺服器超級全域變數數組,用$_SERVER['REMOTE_ADDR']同樣可以擷取到用戶端的IP地址.二者的區別在於,getenv不支援IIS的isapi方式啟動並執行php.

strcasecmp(string1,string2)字串函數的用法是把string1和string2進行比較,如果相等返回0,如果string1大於string2,返回大於0的數,小於則返回小於0的數.

函數先使用客戶IP,如果不成立嘗試用代理的方法,如果不行,再使用REMOTE_ADDR.

還看到過一個檢測IP更詳細的方法,考慮了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;}

一、沒有使用Proxy 伺服器的PHP擷取用戶端IP情況: 

REMOTE_ADDR = 用戶端IP
HTTP_X_FORWARDED_FOR = 沒數值或不顯示

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

REMOTE_ADDR = 最後一個Proxy 伺服器 IP
HTTP_X_FORWARDED_FOR = 用戶端真實 IP (經過多個Proxy 伺服器時,這個值類似:221.5.252.160, 203.98.182.163, 203.129.72.215)
這類Proxy 伺服器還是將用戶端真實的IP發送給了訪問對象,無法達到隱藏真實身份的目的.

三、使用普通匿名Proxy 伺服器的PHP擷取用戶端IP情況:Anonymous Proxies

REMOTE_ADDR = 最後一個Proxy 伺服器 IP
HTTP_X_FORWARDED_FOR = Proxy 伺服器 IP (經過多個Proxy 伺服器時,這個值類似:203.98.182.163, 203.98.182.163, 203.129.72.215)
這種情況下隱藏了用戶端的真實IP,但是向訪問對象透露了用戶端是使用Proxy 伺服器訪問它們的.

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

REMOTE_ADDR = Proxy 伺服器 IP
HTTP_X_FORWARDED_FOR = 隨機的 IP(經過多個Proxy 伺服器時,這個值類似:220.4.251.159, 203.98.182.163, 203.129.72.215)
這種情況下同樣透露了用戶端是使用了Proxy 伺服器,但編造了一個虛假的隨機IP(220.4.251.159)代替用戶端的真實IP來欺騙它.

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

REMOTE_ADDR = Proxy 伺服器 IP
HTTP_X_FORWARDED_FOR = 沒數值或不顯示

無論是REMOTE_ADDR還是HTTP_FORWARDED_FOR,這些頭訊息未必能夠取得到,因為不同的瀏覽器不同的網路裝置可能發送不同的IP頭訊息.因此PHP使用$_SERVER["REMOTE_ADDR"] 、$_SERVER["HTTP_X_FORWARDED_FOR"] 擷取的值可能是空值也可能是“unknown”值.

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.