很多時候,我們需要做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 範圍內的範圍內的負數5.5.55.內的會出現負數情況。
以下程式碼給了一個完整、正確的判斷指定 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相關知識,請造訪PHP中文網!
以上是PHP判斷某個IP4是否屬於某一個IP段的詳細內容。更多資訊請關注PHP中文網其他相關文章!