[PHP] CIDR에 특정 IP 주소가 있는지 확인
요점·결론
ip2long()
라는 신함수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
Reference
이 문제에 관하여([PHP] CIDR에 특정 IP 주소가 있는지 확인), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/kumackey/articles/37c00f302fa41f5e9276텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)