[精讚] [會員登入]
1686

[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

你可能感興趣的文章

[phpmyadmin] 設定預設語言(Language) phpmyadmin預設進來是會選擇你瀏覽器預設的語系,改成正體中文

[PHP] codeignitor4+ smarty4 這篇整合 php 的framework codeignitor4 + smarty4。

[PHP] 使用FTP PHP 上使用 FTP 的寫法

[CodeIgniter 3] COOKIE的使用 PHP CodeIgniter 3 中COOKIE的使用超簡單

設定Google analytics API #2 -- PHP的程式安裝和撰寫 讓你的網站能夠存取你的Google analytics上面的資料

[PHP] 讀取作業系統程式執行結果 PHP讀取作業系統程式執行結果

隨機好文

[jQuery] select 元件的取值及給值 html中的元件select,在jquery中要如何使用?

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

世紀帝國征服者新版本--被遺忘的帝國 世紀帝國征服者新版本--被遺忘的帝國 世紀二代的征服者是精典遊戲中的精典,aofe更好玩...

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

詭異的創業思維 創業的思維中,有多少銀彈,有多少技術,有多少人脈,有多少時間等等,每個都要考慮進去,以熱忱建立的關係脆弱的像蘇打餅乾一樣..