Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to check an IP address is within a range of two IPs in PHP?

Tags:

php

range

ip

I have an IP address and I'm given two other IP addresses which together creates an IP range. I want to check if the first IP address is within this range. How can i find that out in PHP?

like image 928
guitarlass Avatar asked Jun 20 '12 14:06

guitarlass


People also ask

How to check if an IP address of hosts is within range?

This when statement checks if the IP address is within the specified range. By Running test.yml above. It returns True if [IP address] is a valid IP address. By Running test2.yml above. With these 2 syntaxes, you can check if an IP address of hosts is within a range automatically.

How to check for IP is in the range using inetaddress?

By using the above method, let's check for IP is in the range: The getByName () method in InetAddress class takes either domain name or IP address as input and throws UnknownHostException if it's invalid. Let's check our code by running unit tests:

How to know if two IP addresses are on the same network?

So how do you know if two IP addresses are on the same IP network or on two different IP networks? Unfortunately, it isn’t as easy as it is with street addresses to see which part of an IP address that is the IP network and which part belongs to the host addresses. The answer is within something called a Subnet Mask.

What is the range of valid IP addresses?

Each class has a range of valid IP addresses. The value of the first octet determines the class. IP addresses from the first three classes (A, B and C) can be used for host addresses. The other two classes are used for other purposes – class D for multicast and class E for experimental purposes.


2 Answers

With ip2long() it's easy to convert your addresses to numbers. After this, you just have to check if the number is in range:

if ($ip <= $high_ip && $low_ip <= $ip) {   echo "in range"; } 
like image 100
oezi Avatar answered Sep 18 '22 21:09

oezi


This website offers a great guide and code to do this (which was the first result of a Google search for this question):

<?php  /*  * ip_in_range.php - Function to determine if an IP is located in a  *                   specific range as specified via several alternative  *                   formats.  *  * Network ranges can be specified as:  * 1. Wildcard format:     1.2.3.*  * 2. CIDR format:         1.2.3/24  OR  1.2.3.4/255.255.255.0  * 3. Start-End IP format: 1.2.3.0-1.2.3.255  *  * Return value BOOLEAN : ip_in_range($ip, $range);  *  * Copyright 2008: Paul Gregg <[email protected]>  * 10 January 2008  * Version: 1.2  *  * Source website: http://www.pgregg.com/projects/php/ip_in_range/  * Version 1.2  *  * This software is Donationware - if you feel you have benefited from  * the use of this tool then please consider a donation. The value of  * which is entirely left up to your discretion.  * http://www.pgregg.com/donate/  *  * Please do not remove this header, or source attibution from this file.  */   // decbin32 // In order to simplify working with IP addresses (in binary) and their // netmasks, it is easier to ensure that the binary strings are padded // with zeros out to 32 characters - IP addresses are 32 bit numbers Function decbin32 ($dec) {   return str_pad(decbin($dec), 32, '0', STR_PAD_LEFT); }  // ip_in_range // This function takes 2 arguments, an IP address and a "range" in several // different formats. // Network ranges can be specified as: // 1. Wildcard format:     1.2.3.* // 2. CIDR format:         1.2.3/24  OR  1.2.3.4/255.255.255.0 // 3. Start-End IP format: 1.2.3.0-1.2.3.255 // The function will return true if the supplied IP is within the range. // Note little validation is done on the range inputs - it expects you to // use one of the above 3 formats. Function ip_in_range($ip, $range) {   if (strpos($range, '/') !== false) {     // $range is in IP/NETMASK format     list($range, $netmask) = explode('/', $range, 2);     if (strpos($netmask, '.') !== false) {       // $netmask is a 255.255.0.0 format       $netmask = str_replace('*', '0', $netmask);       $netmask_dec = ip2long($netmask);       return ( (ip2long($ip) & $netmask_dec) == (ip2long($range) & $netmask_dec) );     } else {       // $netmask is a CIDR size block       // fix the range argument       $x = explode('.', $range);       while(count($x)<4) $x[] = '0';       list($a,$b,$c,$d) = $x;       $range = sprintf("%u.%u.%u.%u", empty($a)?'0':$a, empty($b)?'0':$b,empty($c)?'0':$c,empty($d)?'0':$d);       $range_dec = ip2long($range);       $ip_dec = ip2long($ip);        # Strategy 1 - Create the netmask with 'netmask' 1s and then fill it to 32 with 0s       #$netmask_dec = bindec(str_pad('', $netmask, '1') . str_pad('', 32-$netmask, '0'));        # Strategy 2 - Use math to create it       $wildcard_dec = pow(2, (32-$netmask)) - 1;       $netmask_dec = ~ $wildcard_dec;        return (($ip_dec & $netmask_dec) == ($range_dec & $netmask_dec));     }   } else {     // range might be 255.255.*.* or 1.2.3.0-1.2.3.255     if (strpos($range, '*') !==false) { // a.b.*.* format       // Just convert to A-B format by setting * to 0 for A and 255 for B       $lower = str_replace('*', '0', $range);       $upper = str_replace('*', '255', $range);       $range = "$lower-$upper";     }      if (strpos($range, '-')!==false) { // A-B format       list($lower, $upper) = explode('-', $range, 2);       $lower_dec = (float)sprintf("%u",ip2long($lower));       $upper_dec = (float)sprintf("%u",ip2long($upper));       $ip_dec = (float)sprintf("%u",ip2long($ip));       return ( ($ip_dec>=$lower_dec) && ($ip_dec<=$upper_dec) );     }      echo 'Range argument is not in 1.2.3.4/24 or 1.2.3.4/255.255.255.0 format';     return false;   }  } ?> 
like image 24
John Conde Avatar answered Sep 19 '22 21:09

John Conde