방문자를 제한하기 위해 IP 블랙리스트 또는 IP 화이트리스트를 만들어야 하는 경우가 많습니다. 가장 일반적인 방법은 방문자를 동일한 IP 세그먼트로 제한하는 것입니다. 범위 내의 모든 IP를 허용하거나 제한하려면 방문자 IP가 이 IP 범위에 속하는지 알아야 합니다. 이 글은 그 방법만을 기록하고 있습니다.
사실 이 글에는 또 다른 응용 시나리오가 있습니다. 즉, 일반적으로 데이터베이스에 저장되는 IP 주소는 varchar 유형으로 IP를 저장하는 경우 최적화할 수 있습니다. 물론 이것은 IP4에 대해서만 설명됩니다.
IP가 특정 IP 세그먼트에 속하는지 확인하려면 IP를 int 유형 값으로 변환한 다음 비교하는 것이 좋습니다. PHP에는 ip와 숫자 값을 교환하는 내장 함수인 ip2long($ip_addr) 및 long2ip($long)이 있습니다.
ip2long($ip_addr)에서 $ip_addr이 유효한 IP 주소가 아닌 경우 false를 반환하며, 유효한 IP 주소인 경우 signed long 형식으로 변환되기도 합니다. IP 주소 변환이 signed long의 길이를 초과하여 음수가 나올 수 있습니다.
long 유형은 4바이트, 부호 있는 범위: 2147483647 ~ -2147483648, 부호 없는 범위: 4294967295 ~ 0
그리고 가장 큰 IP4 주소는 255.255입니다. 255.255이고 해당 값은 4294967295이므로 부호 없는 값으로 변환할 수 있습니다. 값 2147483647에 해당하는 IP는 127.255.255.255,
long2ip(2147483647)이므로 0.0.0.0~127.255.255.255 범위 및 그 사이의 IP 주소에는 음수가 없습니다. 128.0.0.0 및 255. 255. 음수는 255.255 범위 내에서 발생합니다.
다음 코드는 지정된 IP가 특정 IP 세그먼트에 속하는지 여부를 확인하는 완전하고 정확한 예를 제공합니다.
$start_ip = "42.236.184.1"; $end_ip = "42.236.184.255"; $ip = "42.236.184.128"; check_ip($ip,$start_ip,$end_ip); function check_ip($ip,$start_ip,$end_ip) { $ip = get_ip2long($ip); $start_ip = get_ip2long($start_ip); $end_ip = get_ip2long($end_ip); if($ip >= $start_ip && $ip <= $end_ip) { return true; } return false; } // decbin() 十进制转二进制 // bindec() 二进制转十进制。函数将一个二进制数转换成 integer。可转换的最大的数为 31 位 1 或者说十进制的 2147483647。PHP 4.1.0 开始,该函数可以处理大数值,这种情况下,它会返回 float 类型。 function get_ip2long($ip) { return bindec(decbin(ip2long($ip))); //方法二:return sprintf('%u',ip2long($ip)); //%u:不包含正负号的十进制数 }
PHP 관련 지식을 더 보려면 PHP中文网을 방문하세요!
위 내용은 PHP는 IP4가 특정 IP 세그먼트에 속하는지 확인합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!