Skip to content

Instantly share code, notes, and snippets.

@tott
Created November 27, 2013 22:46
Show Gist options
  • Save tott/7684443 to your computer and use it in GitHub Desktop.
Save tott/7684443 to your computer and use it in GitHub Desktop.
php check if IP is in given network range
/**
* Check if a given ip is in a network
* @param string $ip IP to check in IPV4 format eg. 127.0.0.1
* @param string $range IP/CIDR netmask eg. 127.0.0.0/24, also 127.0.0.1 is accepted and /32 assumed
* @return boolean true if the ip is in this range / false if not.
*/
function ip_in_range( $ip, $range ) {
if ( strpos( $range, '/' ) == false ) {
$range .= '/32';
}
// $range is in IP/CIDR format eg 127.0.0.1/24
list( $range, $netmask ) = explode( '/', $range, 2 );
$range_decimal = ip2long( $range );
$ip_decimal = ip2long( $ip );
$wildcard_decimal = pow( 2, ( 32 - $netmask ) ) - 1;
$netmask_decimal = ~ $wildcard_decimal;
return ( ( $ip_decimal & $netmask_decimal ) == ( $range_decimal & $netmask_decimal ) );
}
@modder2
Copy link

modder2 commented Sep 1, 2020

See also the implementation by cloudflare, supporting ipv4 and v6: https://github.com/cloudflare/CloudFlare-Tools/blob/master/cloudflare/ip_in_range.php

Thanks for the link! This is what I need.

@Pseudodevincent
Copy link

Thanks a lot !

@c7borg
Copy link

c7borg commented Jan 7, 2021

Thank you.. useful for a lot of projects

@miqueiaspenha
Copy link

Thanks!

@irfanhussain22
Copy link

good stuff

@shahiddgk
Copy link

how to find ipv6 in range.

@Lades268
Copy link

Great Job.

this modification can be made
if (strpos($range, '/' ) == false) { return $ip == $range; }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment