zoukankan      html  css  js  c++  java
  • 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';
    }
  • 相关阅读:
    JAVA NIO
    Spider、xmlSpider、FeedSpider、CrawlSpider、RedisSpider分别作用
    Scrapy中xpath用到中文报错
    xpath无法匹配tbody标签
    读书-《不凶不吼教出好孩子》-管教孩子应该先管好自己
    Markdown基本语法
    读书-《刻意练习》天才与庸才的距离
    读书-《第一次买保险就买对》保险我们这样买
    读书-《断舍离》做减法来生活
    读书-《富爸爸穷爸爸》的财商教育经
  • 原文地址:https://www.cnblogs.com/rnckty/p/4422210.html
Copyright © 2011-2022 走看看