首頁 >後端開發 >php教程 >PHP判斷某個IP4是否屬於某一個IP段

PHP判斷某個IP4是否屬於某一個IP段

angryTom
angryTom轉載
2019-10-15 16:53:364268瀏覽

PHP判斷某個IP4是否屬於某一個IP段

很多時候,我們需要做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(&#39;%u&#39;,ip2long($ip)); //%u:不包含正负号的十进制数
}

 更多PHP相關知識,請造訪PHP中文網

以上是PHP判斷某個IP4是否屬於某一個IP段的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:www.mafutian.net。如有侵權,請聯絡admin@php.cn刪除