On Thu, 4 Apr 2002, Devin Atencio wrote:
> I was wondering If I made a database to store a list of IP CIDR
> in a database to block, how I could take an IP of a customer coming
> in and find a quick way if it matches a blocked IP in the database?
> 
> For instance, in the database I would store something like this:
> 
> 208.219.20.0/24       
> 
> Then if someone came in on 208.219.20.22, it would know that the entire
> class C was blocked. Is there an easy way to deal with this type of
> thing in PHP/MySQL?

Here's a little (tested just once but I'm guessing it's sound) example of
IP/subnet checking in PHP (converting between /24 and 255.255.255.0
notation is left as a homework exercise). Store them as INTs in MySQL and
you can use the & operator when selecting. However I don't think that
MySQL yet supports bitwise indexes so no promises on speed.

------------------

  <? 

  if ($_REQUEST['go'])
  { 
    $subnet = dotted_to_int($_REQUEST['subnet']);  
    $netmask = dotted_to_int($_REQUEST['netmask']);
    $ip = dotted_to_int($_REQUEST['ip']);          
   
    if (($ip & $netmask) == $subnet) print 'Address is in range';
    else print 'Address out of range';
  }

  function dotted_to_int($addr)
  {
    $octets = explode('.', ereg_replace('[^0-9\.]', '', $addr));
    return
      $octets[3] +
      (256 * $octets[2]) +    
      (65536 * $octets[1]) +  
      (16777216 * $octets[0]);
  } 
  
  ?>

  <form method="post" action="<?= $PHP_SELF ?>">
  Subnet: <input name="subnet">
  <br>Netmask: <input name="netmask">
  <br>IP to check: <input name="ip">
  <br><input name="go" value="Check it" type="submit"></form>

------------------

miguel


-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to