自動目錄
要檢查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