= $lower_dec) && ($ip_dec <= $upper_dec)); } return false; } public static function IsIpInRangeList(string $ip, array $ranges) { foreach ($ranges as $range) { if (self::IsIpInRange($ip, $range)) { return true; } } return false; } /** * @param string $ip IP address * @param string $netmask Netmask * @return bool true if IP is in the netmask */ public static function IsIpInNetmask(string $ip, string $netmask) { if (strpos($netmask, '/') !== false) { list($range, $netmask) = explode('/', $netmask, 2); if (strpos($netmask, '.') !== false) { // $netmask is a $netmask = str_replace('*', '0', $netmask); $netmask_dec = ip2long($netmask); return ((ip2long($ip) & $netmask_dec) == (ip2long($range) & $netmask_dec)); } } return false; } public static function IsIpInNetmaskList(string $ip, array $netmasks) { foreach ($netmasks as $netmask) { if (self::IsIpInNetmask($ip, $netmask)) { return true; } } return false; } /** * @param string $ip IP address * @param string $cidr CIDR * @return bool true if IP is in the CIDR */ public static function IsIpInCidrRange(string $ip, string $cidr) { list($subnet, $bits) = explode('/', $cidr); if ($bits === null) { $bits = 32; } $ip = ip2long($ip); $subnet = ip2long($subnet); $mask = -1 << (32 - $bits); $subnet &= $mask; # nb: in case the supplied subnet wasn't correctly aligned return ($ip & $mask) == $subnet; } public static function IsIpInCidrRangeList(string $ip, array $cidrs) { foreach ($cidrs as $cidr) { if (self::IsIpInCidrRange($ip, $cidr)) { return true; } } return false; } public static function IsIpInCidrNetmaskOrRangeList(string $ip, array $cidrs) { foreach ($cidrs as $cidr) { if (self::IsIpInCidrRange($ip, $cidr) || self::IsIpInNetmask($ip, $cidr) || self::IsIpInRange($ip, $cidr) || $ip === $cidr) { return true; } } return false; } } }