很多時候,我們需要做 IP 黑名單或者 IP 白名單,來對訪客進行限制,很常見的一種就是對同一 IP 段內的所有 IP 進行允許或限制,那麼就我們就需要知道訪客 IP 是否屬於該 IP 段範圍內。本文僅記錄一下方法。
其實本文還有一個應用場景,就是通常儲存在資料庫中的 IP 地址都是 varchar 型別的,而如果採用 INT 型別來儲存 IP ,則可以對資料庫起到優化的作用,當然這裡只是針對 IP4 進行講解。
判斷一個 IP 是否屬於某一個 IP 段,思路就是將 IP 轉換成 int 型別的數值,然後進行比較。而在 PHP 中內建了 ip 和數值的互換的函數:ip2long($ip_addr) 和 long2ip($long)。
ip2long($ip_addr)中若 $ip_addr 不是有效的 IP 地址,則會返回 false,若是有效的 IP 地址,則會將其轉換為有符號 long 型別,而有些時候 IP 地址轉換後可能會超出有符號的 long 長度,這樣會導致出現負數。
long 型別是 4 個位元組的,其有符號範圍是:2147483647 ~ -2147483648,無符號的範圍是:4294967295 ~ 0
而最大的 IP4 地址是:255.255.255.255,對應的數值是:4294967295,所以可以將其轉成無符號的數值。2147483647 數值對應的 IP 為:127.255.255.255,
long2ip(2147483647)所以 IP 地址在 0.0.0.0 至 127.255.255.255 範圍內的不會出現負數,而在 128.0.0.0 至 255.255.255.255 範圍內的會出現負數情況。
以下程式碼給出了一個完整、正確的判斷指定 IP 是否屬於某 IP 段內的小例子。
$start_ip = "42.236.184.1"; $end_ip = "42.236.184.255"; $ip = "42.236.184.128"; check_ip($ip,$start_ip,$end_ip); function check_ip($ip,$start_ip,$end_ip) { $ip = get_ip2long($ip); $start_ip = get_ip2long($start_ip); $end_ip = get_ip2long($end_ip); if($ip >= $start_ip && $ip <= $end_ip) { return true; } return false; } // decbin() 十進位制轉二進位制 // bindec() 二進位制轉十進位制。函數將一個二進位制數轉換成 integer。可轉換的最大的數為 31 位 1 或者說十進位制的 2147483647。PHP 4.1.0 開始,該函數可以處理大數值,這種情況下,它會返回 float 型別。 function get_ip2long($ip) { return bindec(decbin(ip2long($ip))); //方法二:return sprintf('%u',ip2long($ip)); //%u:不包含正負號的十進位制數 }
以上就是PHP判斷某個IP4是否屬於某一個IP段的詳細內容,更多請關注TW511.COM其它相關文章!