php根據ip段以及子網掩碼,判斷某ip是否處於某子網下


    為了檢測客戶端ip是否位於指定的網絡里(如防火牆過濾有時候需要用到這個技術),有如下方法:
1、第一種
        public function netMatch($client_ip, $server_ip, $mask)
	{
		$mask1 = 32 - $mask;
                return ((ip2long($client_ip) >> $mask1) == (ip2long($server_ip) >> $mask1));
	}
    
        $client_ip = '192.168.1.15';
        $server_ip = '192.168.1.1';
        $mask = 24;

        $res = netMatch( $dev_ip, $server_ip , $mask );

  

2、第二種
    1、客戶端ip,假設符號是D
    2、該網絡下的ip地址段,假設符號是N
    3、該網絡下的子網掩碼,假設符號是M
    那么,如果客戶端ip處於該網絡下,應該會滿足:
    N==(D&M)
 
    文字解釋就是,用客戶端ip和子網掩碼進行與操作,所得結果應該與該網絡下的ip段相等。不過注意一個問題,上面的公式,是用二進制進行計算的,並不是我們常見的點分十進制的ip地址。也就是說,我們獲得客戶端ip后,應該把它轉換為32位二進制數字再進行計算。
    代碼如下:
function ip_binay($ip)
{
        $ip_array = explode(".",$ip);
        $t = '';
        foreach($ip_array as $v)
        {
                $tmp = decbin($v);
                $tmp_len = strlen(decbin($v));
                if($tmp_len < 8)
                        $t .= str_repeat( "0",(8 - $tmp_len) ).$tmp;
                else
                        $t .= $tmp;
        }
        return $t;
}
$server_ip = "0.0.0.0"; //地址段
$mask_ip = "0.0.0.0"; //子網掩碼
 
$client_ip='192.168.1.11';//客戶端ip
 
$D=ip_binay($client_ip);
$is_ip_in=0;
$M = ip_binay($mask_ip);
$temp = $D & $M;
$N = ip_binay( $server_ip );
if( $temp == $N ){
    $is_ip_in=1;
}
 
if($is_ip_in){
    echo "你的ip處於該網絡下!";
}else{
    echo 'NO';
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM