要檢查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