您好,登錄后才能下訂單哦!
小編給大家分享一下PHP判斷某個IP4是否屬于某一個IP段的方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
很多時候,我們需要做 IP 黑名單或者 IP 白名單,來對訪客進(jìn)行限制,很常見的一種就是對同一 IP 段內(nèi)的所有 IP 進(jìn)行允許或限制,那么就我們就需要知道訪客 IP 是否屬于該 IP 段范圍內(nèi)。本文僅記錄一下方法。
其實本文還有一個應(yīng)用場景,就是通常存儲在數(shù)據(jù)庫中的 IP 地址都是 varchar 類型的,而如果采用 INT 類型來保存 IP ,則可以對數(shù)據(jù)庫起到優(yōu)化的作用,當(dāng)然這里只是針對 IP4 進(jìn)行講解。
判斷一個 IP 是否屬于某一個 IP 段,思路就是將 IP 轉(zhuǎn)換成 int 類型的數(shù)值,然后進(jìn)行比較。而在 PHP 中內(nèi)置了 ip 和數(shù)值的互換的函數(shù):ip2long($ip_addr) 和 long2ip($long)。
ip2long($ip_addr)中若 $ip_addr 不是有效的 IP 地址,則會返回 false,若是有效的 IP 地址,則會將其轉(zhuǎn)換為有符號 long 類型,而有些時候 IP 地址轉(zhuǎn)換后可能會超出有符號的 long 長度,這樣會導(dǎo)致出現(xiàn)負(fù)數(shù)。
long 類型是 4 個字節(jié)的,其有符號范圍是:2147483647 ~ -2147483648,無符號的范圍是:4294967295 ~ 0
而最大的 IP4 地址是:255.255.255.255,對應(yīng)的數(shù)值是:4294967295,所以可以將其轉(zhuǎn)成無符號的數(shù)值。2147483647 數(shù)值對應(yīng)的 IP 為:127.255.255.255,
long2ip(2147483647)所以 IP 地址在 0.0.0.0 至 127.255.255.255 范圍內(nèi)的不會出現(xiàn)負(fù)數(shù),而在 128.0.0.0 至 255.255.255.255 范圍內(nèi)的會出現(xiàn)負(fù)數(shù)情況。
以下代碼給出了一個完整、正確的判斷指定 IP 是否屬于某 IP 段內(nèi)的小例子。
$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() 十進(jìn)制轉(zhuǎn)二進(jìn)制 // bindec() 二進(jìn)制轉(zhuǎn)十進(jìn)制。函數(shù)將一個二進(jìn)制數(shù)轉(zhuǎn)換成 integer??赊D(zhuǎn)換的最大的數(shù)為 31 位 1 或者說十進(jìn)制的 2147483647。PHP 4.1.0 開始,該函數(shù)可以處理大數(shù)值,這種情況下,它會返回 float 類型。 function get_ip2long($ip) { return bindec(decbin(ip2long($ip))); //方法二:return sprintf('%u',ip2long($ip)); //%u:不包含正負(fù)號的十進(jìn)制數(shù) }
看完了這篇文章,相信你對PHP判斷某個IP4是否屬于某一個IP段的方法有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。