[精讚] [會員登入]
1653

[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

你可能感興趣的文章

PHP 數字加解密函式 自寫的數字加解密,勉強用

[CodeIgniter3] 解決無法上傳特定檔案(.sb2)的問題 上傳時出現The filetype you are attempting to upload is not allowed,要怎麼解決?

[PHP] 台灣身分證號及檢查程式 台灣身分證號及PHP檢查程式

[PHP] 處理mail 函式的標題中文字亂碼 PHP的mail函式若標題有中文字得先處理過,否則收信者會看到亂碼

[PHP] 2個程式的觀念 整理2個PHP的程式觀念,參考參考。

[PHP] 將字串的部分加上遮罩的函式 有些資料會想要隱藏部分的字元,例如身分證號或信用卡號、電話等。我寫了一個函式來完成這個功能。

隨機好文

談借錢 人借錢時手心向上頭向下,人還錢時手心向下頭向上

安裝SPHINX支援中文 新版本的 sphinx 和舊版不同,網路上很多範例和教學是不能用的。此文是安裝和設定方法分享

[CodeIgniter3] 解決無法上傳特定檔案(.sb2)的問題 上傳時出現The filetype you are attempting to upload is not allowed,要怎麼解決?

一個邏輯的錯誤刪了全部檔案的經驗 今天本來想做一件很簡單的事,但卻足足浪費我多一倍的時間,再加上刪掉我全部的檔案,原因只是因為我自己的邏輯錯誤。

[CodeIgniter 3] 資料庫的使用方法整理2/2 CI3 承襲 CI2,有很多的builder class可以用,依各人的使用習慣,有人喜歡一堆sql字串,有人喜歡用helper