= $lower_dec) && ($ip_dec <= $upper_dec)); } return false; } /** * Determines if the given address is in the list of IP range notations. * * @param string $ip IP address * @param array $ranges IP ranges * * @return bool true if IP is in any of the ranges */ public static function IsIpInRangeList(string $ip, array $ranges) { foreach ($ranges as $range) { if (self::IsIpInRange($ip, $range)) { return true; } } return false; } /** * Determine if the given IP is in the Netmask notation like below: * * $ip = "127.0.0.1" * $netmask = "127.0.0.0/255.255.255.0" * * $isInNetmask = IpHelper::IsIpInNetmask($ip, $netmask); // true * * @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; } /** * Determines if the given address is in the list of Netmask notations. * * @param string $ip IP address * @param array $netmasks Netmasks * * @return bool true if IP is in any of the netmasks */ public static function IsIpInNetmaskList(string $ip, array $netmasks) { foreach ($netmasks as $netmask) { if (self::IsIpInNetmask($ip, $netmask)) { return true; } } return false; } /** * Determines if the given IP is in the CIDR notation like below: * * $ip = "127.0.0.1" * $cidr = "127.0.0.0/8" * * $isInCidr = IpHelper::IsIpInCidrRange($ip, $cidr); // true * * @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; } /** * Determine if the given IP is in the CIDR notation list. * * @param string $ip IP address * @param array $cidrs CIDRs * * @return bool true if IP is in any of the CIDRs */ public static function IsIpInCidrRangeList(string $ip, array $cidrs) { foreach ($cidrs as $cidr) { if (self::IsIpInCidrRange($ip, $cidr)) { return true; } } return false; } /** * Determines if the given IP is in the given CIDR, Range or Netmask list * * @param string $ip IP address * @param string $cidr CIDR, Range or Netmask * * @return bool true if IP is in the any of the CIDRs, Ranges or Netmasks */ 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; } } }