[精讚] [會員登入]
3414

[PHP] 檢查IP是否在某個網段內 mtachcidr

“
要檢查IP是否在某個網段內,要寫幾行?10行?5行? 不用,只要2行。以下是我寫的 code /** * matchCI
„

分享此文連結 //n.sfs.tw/10170

分享連結 [PHP] 檢查IP是否在某個網段內 mtachcidr@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2019-10-25 13:16:47 最後編修
2016-11-05 11:20:04 By 張○○
 

自動目錄

要檢查IP是否在某個網段內,要寫幾行?10行?5行?不用,只要2行。

函式

/**
* matchCIDR() - 判斷兩個地址是否在某個子網内
* @param $addr 地址IP ex.. 1.2.3.4
* @param $cidr 網段範圍 ex .. 1.2.3.5/24
* @return 同網段回傳 1 否則回傳 null
*/
public function matchCIDR($addr, $cidr) {
     list($ip, $mask) = explode('/', $cidr);
     return (ip2long($addr) >> (32 - $mask) == ip2long($ip) >> (32 - $mask));
}

用法

$schcidr="163.17.40.0/24";
$ip=$_SERVER["REMOTE_ADDR"];

if( matchCIDR($ip, $schcidr) )
  //  in this net, do something...
else
  //  get out of here....

 

運算法是大家少知道的推移(shift)運算法,他的效能是乘法的10倍+,所以並不會為了精簡而輸了效能。

美中不足的,就是如果是 ipv6 的使用者,會遇到麻煩,請參考下面的連結。

 

相關連結

[PHP] IPv6檢查IP是否在某個網段內 mtachcidr6


原文 2009-11-08 20:03:51 程式於2007

END

你可能感興趣的文章

[PHP] 好用的php常數 介紹PHP中 __DIR__, __FILE__, __FUNCTION__, __CLASS__, __METHOD__, __LINE__, __NAMESPACE__等常數

[phpmyadmin] 錯誤:您應升級到 MySQL 5.5.0 或更新版本 使用phpmyadmin4出現錯誤:您應升級到 MySQL 5.5.0 或更新版本的解決方式

使用strcmp來判斷日期是否介於某日期之間 要比較現在日期是否在兩個日期之間,使用字串比對的方法

[PHP8] 使用autoload autoload+ namespace +use 到了php7之後,namespace和use越來越重要,此篇整理autoload和namespace、use的結合使用。

[PHP] CodeIgniter 3+pure+smarty安裝及環境設置2/2 PHP framework CodeIgniter 3+ pure CSS +smarty Template Engine的整合#2

[PHP] UTF8中取出字串中特定的字數 要將字串,例如資料庫取出的TEXT,取出特定的字數

隨機好文

[jQuery] select 元件的取值及給值 html中的元件select,在jquery中要如何使用?

[Freebsd] 使用 ADSL 撥接上網 Freebsd上要使用 ADSL 撥接上網,該如何設定?

為什麼要重造輪子? 什麼輪子?造什麼輪子?我為什麼要重造輪子?

[bc] linux 的計算機 bc 設定小數位數、計算π、次方根 linux 的計算機 bc 設定小數位數、計算π、次方根

[CodeIgniter3] 解決無法上傳特定檔案(.sb2)的問題 上傳時出現The filetype you are attempting to upload is not allowed,要怎麼解決?