[精讚] [會員登入]
1638

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

要檢查IPv6是否在某個IPv6的網段內?

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

分享連結 [PHP] IPv6檢查IP是否在某個網段內 mtachcidr6@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2019-10-24 09:56:46 最後編修
2018-10-12 01:50:25 By 張○○
 

自動目錄

由於 IPv4 可以轉成十進位用推移的運算,但是 IPv6 要轉成十進位的話,會超過有效位數的顯示,另外由於ipv6本身是用十六進位表示,沒必要換成10進位。所以要用更漂亮的作法。我把他寫成 class  = =!!:

函式

/**
*   ipv6 class by axer@ms1.boe.tcc.edu.tw
*/
class ipv6{
    /**
    *   ExpandIPv6Notation2Bin()-  Convert an ipv6 address to bin string
    *   @param string $ip6 - an ipv6 address
    *   @return return the binary string of an ipv6 address if parameter ip6 is an ipv6 address,
    *           else it return an empty string.
    */
    public function ExpandIPv6Notation2Bin($ip6) {
        if (strpos($ip6, '::') !== false)
            $ip6 = str_replace('::', str_repeat(':0', 8 - substr_count($ip6, ':')).':', $ip6);
        $ip6parts = explode(':', $ip6);
        $res="";
        foreach ($ip6parts as $part)
            $res .= str_pad(base_convert( $part, 16, 2), 16, 0, STR_PAD_LEFT);
        return $res;
    }

    /**
    *   MatchCIDR6 -- Check if an ipv6 address is in the CDIR6 subnet.
    *   @param string $cidr6 - an ipv6 subnet, ex 2001:288:5400/39 or 2001:288:5432:/64 or 2001:288:5478::/64..
    *   @param string $chkipv6 - an ipv6 address, ex ::1, 2001:288:5200::1, :: ,etc.
    *   @return return true if $chkipv6 is inside the $cidr6 subnet, or return false.
    */
    public function MatchCIDR6( $cidr6, $chkipv6)
    {
        list($ip6, $prefixlen) = explode('/', $cidr6);
        $cidrbin= substr( $this->ExpandIPv6Notation2Bin($ip6), 0, $prefixlen);
        $chkip6bin= substr( $this->ExpandIPv6Notation2Bin($chkipv6), 0, $prefixlen);
        if(! strcmp($cidrbin,$chkip6bin))return true;
        return false;
    }
}

用法

$cidr6 = "2001:288:5400/39";
$ip6= "2001:288:5300:000::72A:4BE7";
$o_ipv6 = new ipv6();
// 檢查是ip6 是否在網段內
if( $o_ipv6->MatchCIDR6($cidr6,$ip6))
    print "Inside";
else
    print "Outside";

 

備註:有參考別人的程式,不過來源佚失了

 

相關連結

[PERL] 檢查IP是否在某個網段內:matchcidr


原文 2009-11-26

END

你可能感興趣的文章

[CodeIgniter 3] 自寫找不到頁面(page404)的方法 使用CI3框架中如果找不到頁面,就會導到一個自定的404頁面,該怎麼做?

[PHP] 陣列新增資料及整理 在php陣列加入項目和重新整理陣列的方法

[PHP+ci4] codeignitor4 Cache 及 Session 使用 memcached php 的framework codeignitor4 中的cache和session使用memcached

[CodeIgniter 3] 資料庫的使用方法整理1/2 --Select的使用 [CodeIgniter 3] 資料庫的使用方法整理:Select的使用

[PHP] 如何寫callback function 召回函數(回呼函數) PHP如何寫召回函數或回呼函數(callback function)?

PHP判斷對方瀏覽器語系 多語系的網頁應該主動偵查瀏覽器的語系,配合使用者跳出合適的語系。

隨機好文

為什麼要買長達二十年的保單? 為什麼要買長達二十年的保單?找一個可以說服我買二十年保單的理由。

UTF8中文字/全形一覽 快速查詢urf-8的中文字,共計13246中文字(5401常用字+7652罕用字+日文或編號),292全形符號,27半形符號。

看懂DSUB DVI HDMI USB等各式影音接頭 看懂DSUB DVI HDMI等各式影音接頭

魔球中小女孩唱的歌 The show 魔球中小女孩唱的歌 The show

APACHE的記錄檔格式 LogFormat 語法 在APACHE中有定義一些記錄的語法模版 在 /etc/httpd/conf/httpd.conf 中: LogForm