[PHP] CIDR에 특정 IP 주소가 있는지 확인

9434 단어 PHPcidrtech

요점·결론

  • dotted decimal notation의 변환으로 ip2long()라는 신함수
  • 를 준비했습니다.
  • CIDR의 호스트 부위의 비트를 마스크로 변환하기 위해 비트레이트 연산
  • CIDR에 특정 IP 주소가 포함되어 있는지의 검사는 마스크의 논리적 축적과 일치하는지 여부를 판단할 수 있다
  • PHP: ip2long - Manual
    PHP: Bitwise Operators - Manual

    이루어지다


    CIDR.php
    <?php
    
    class CIDR
    {
        private int $mask;
    
        private int $binary_network_prefix;
    
        /**
         * CIDR constructor.
         *
         * @param string $cidr 例: 127.0.0.0/30
         * @throws Exception
         */
        public function __construct(string $cidr)
        {
            list($network_prefix, $bits) = explode('/', $cidr);
    
            // 例: $bits = 25なら、11111111111111111111111110000000となる
            $mask = (0xffffffff << (32 - $bits)) & 0xffffffff;
            $binary_network_prefix = ip2long($network_prefix);
    
            if (($binary_network_prefix & $mask) !== $binary_network_prefix) {
                // 127.0.0.1/5 のようにCIDR表記として間違っている
                throw new Exception('invalid CIDR input.');
            }
    
            $this->mask = $mask;
            $this->binary_network_prefix = $binary_network_prefix;
        }
    
        /**
         * @param string $ip 例: 127.0.0.12
         * @return bool
         */
        public function contains(string $ip): bool
        {
            // ネットワーク部が一致しているかを判定する
            return (ip2long($ip) & $this->mask) === $this->binary_network_prefix;
        }
    }
    
    $cidr = new CIDR('127.0.0.0/26');
    
    // bool(true) CIDR範囲内
    var_dump($cidr->contains('127.0.0.3'));
    
    // bool(false) CIDR範囲外
    var_dump($cidr->contains('127.0.0.255'));
    
    // bool(true) ネットワークアドレスも含む
    var_dump($cidr->contains('127.0.0.0'));
    
    // bool(true) ブロードキャストアドレスも含む
    var_dump($cidr->contains('127.0.0.63'));
    
    // bool(false) ブロードキャストアドレス超過
    var_dump($cidr->contains('127.0.0.64'));
    

    주의점


    응용 프로그램의 도면층에서 IP 주소를 제한하는 것은 사실 NG이다.
    기본적으로nginx로 설정하세요.
    Module ngx_http_access_module

    좋은 웹페이지 즐겨찾기