ipv4 和 ipv6分段處理方式進行白名單驗證


  1 <?php
  2 /*
  3 ipv4 和 ipv6 做分段處理, 這是這次討論及處理的問題.
  4  
  5 在做ipv4與ipv6分段之前,需要了解ipv4與ipv6的信息.
  6  
  7 ipv4:
  8 ipv4 是采用32位2進制編碼的, 將32划分為4段, 那么每一段是8位, 例如: 11111111.11111111.00000001.00000001. 而IP表示是通過十進制表示的,例如255.255.1.1
  9  
 10 ipv6:
 11 ipv6是采用128位2進制編碼的.將128位分為8段,每一段是16位,而IP表示是通過十六進制進行表示的, 例如2001:da8c:ac11:3003:0008:0000:0000:0058 .
 12  
 13 ipv4,ipv6詳解,另行查看.
 14  
 15 需求, IP白名單,根據IP區段進行驗證.
 16  
 17 分析, ipv4固定的4個段,可以根據區段進行處理.
 18  
 19 假設,添加白名單的ip是,192.168.1.*, 而* 所代表的是0-255, 例如ip是 192.168.1.1 就可以訪問.而 192.168.2.* 就不可能訪問.
 20  
 21 */
 22 //解決方案.
 23 //定義一個IP白名單.
 24 $IP_WHITE_LIST = [#IP白名單區段
 25   '192.168.1' => [
 26     'start' => '0',
 27     'end' => '255',
 28   ],
 29 ];
 30  
 31 function checkIpWhiteList ($ip)
 32 {
 33   $whiteList =  $IP_WHITE_LIST;
 34   $segment = substr($ip, 0, strirpos($ip, '.'));
 35   $intervalVal = substr($ip, strirpos($ip, '.')+1);
 36   if(isset($whiteList[$segment]))
 37   {
 38     if($intervalVal >= $whiteList[$segment]['start'] || $intervalVal <= $whiteList[$segment]['end'])
 39     {
 40       return true;
 41     }
 42   }
 43   return false;
 44 }
 45  
 46 //分析, ipv6不是固定的8個段, 如果是2001:da8c:ac11:3003:0008:0000:0000:0058 就會變成 2001:da8c:ac11:3003:8::58.所以是不是考慮,自己進行填充.
 47  
 48 //解決方案:
 49 $IP_WHITE_LIST = [ #IP白名單區段
 50   '2001:da8c:ac11:3003:0008:0000:0000' => [
 51     'start' => '0000',
 52     'end' => 'ffff',
 53   ],
 54 ];
 55  
 56 function checkIpWhiteList ($ip) {
 57   $whiteList = $IP_WHITE_LIST;
 58   $new_ip = getFullIp($ip);
 59   $segment = substr($new_ip, 0, strripos($new_ip, ':'));
 60   $intervalVal = substr($new_ip, strripos($new_ip, ':')+1);
 61  
 62   if(isset($whiteList[$segment]))
 63   {
 64     if(strcmp($intervalVal, $whiteList[$segment]['start']) >= 0 || strcmp($intervalVal, $whiteList[$segment]['end']) <=0)
 65     {
 66       return true;
 67     }
 68   }
 69   return false;
 70 }
 71  
 72 function getFullIp ($ip)
 73 {
 74   if(!$ip) {
 75     return false;
 76   }
 77   $segmentArr = explode(":", $ip);
 78   if('8' == count($segmentArr)) {
 79     foreach($segmentArr as &$val) {
 80       $val = ('4' == strlen($val)) ? $val: str_pad($val, 4, 0, STR_PAD_LEFT);
 81     }
 82   }
 83   if(count($segmentArr) < '8') {
 84     foreach($segmentArr as &$val) {
 85       if('' != $val) {
 86         $val = ('4' == strlen($val)) ? $val: str_pad($val, 4, 0, STR_PAD_LEFT);
 87       }else {
 88         $base = '0000';
 89         $difference = (8 - count($segmentArr)) + 1;
 90         for($i = 1; $i<=$difference; $i++)
 91         {
 92           $val .= $base.":";
 93         }
 94         $val = trim($val, ':');
 95       }
 96     }
 97   }
 98   return implode(':', $segmentArr);
 99 }
100  
101 ?>

 


免責聲明!

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



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