IP como número entero en PHP

Cualquier dirección IP de la forma AAA.BBB.CCC.DDD tiene una representación equivalente como número entero. Esta transformación se puede hacer de forma directa en PHP mediante la utilización de las funciones ip2long y long2ip, que pasan una ip a numero entero y un número entero a ip, respectivamente.

Hay que tener en cuenta que la función ip2long devuelve un número entero que puede contener un valor negativo, por lo que puede ser necesario utilizar %u como atributo de las función sprintf para mostrarlo como entero sin signo en algunos casos. Por otra parte hay que tener también en cuenta que la dirección ip que se utilice no tiene porqué estar completa, por lo que podemos obtener la representación entera de direcciones como «192.168», que sería equivalente a «192.168.0.0».

Estas funciones nos permiten realizar de forma sencilla comprobaciones sobre direcciones ip, de forma que podemos comparar direcciones y comprobar si una dirección está en un determinado rango CIDR de forma correcta.

Comparación de IP’s

Podemos realizar comparaciones entre direcciones ip sin estar restringidos a la mera comparación como strings, la cual no siempre funciona como podríamos esperar.

<?php
$ip_addr1 = "192.168.0.1";
$ip_addr2 = "192.168.000.001";
 
if($ip_addr1 == $ip_addr2) echo "OK";
else echo "NOK";
?>

El código anterior nos devolvería «NOK», aunque las dos direcciones en realidad son la misma. Esto se debe a que pese a representar la misma dirección IP, su representación como string es distinta. Sin embargo el siguiente código que utiliza la función ip2long realiza la comparación correctamente.

<?php
$ip_addr1 = "192.168.0.1";
$ip_addr2 = "192.168.000.001";
 
if(ip2long($ip_addr1) == ip2long($ip_addr2)) echo "OK";
else echo "NOK";
 
?>

Pertenencia a rango CIDR

Si queremos comprobar si una determinada dirección pertenece a un rango de direcciones como «192.168.0.0/24», podríamos utilizar la siguiente función, que dada una dirección IP y el rango CIDR, nos devuelve true si la dirección pertenece al rango.

<?php
function matchCIDR($addr, $cidr) {
   // $addr should be an ip address in the format '0.0.0.0'
   // $cidr should be a string in the format '100/8'
   list($ip, $mask) = explode('/', $cidr);
   $mask = 0xffffffff << (32 - $mask);
   $output = ((ip2long($addr) & $mask) == (ip2long($ip) & $mask));
   return $output;
}
?>

Más información

Twitter Digg Delicious Stumbleupon Technorati Facebook Email

5 Respuestas para “IP como número entero en PHP”

  1. la verdad es que me instalê con un ciber hace ya tres meses.
    en los tres meses en que me dedico a esto aparecen unos Sujetos que dejan los computadores para la historia metiendose a la configuracion.
    luego aparecen otros tipos que se ofresen para arreglar tu ciber y la verdad es que nunca uno los ha visto, es por esto que quiero aprender a configurar una red pequeña con windows xp.
    tengo instalado un modem ARESCOM Net DSL 800 mas un Router D-Link
    D-I707P CONECTADO A 5 PCs. mas un servidor
    los controladores del ARESCOM no los tengo por que la compañia de lelëfonos no los entrega. muchas gracias

  2. A mi no me devuelve nada la función, ni true ni false.

  3. Gracias amigo… me funciono de maravilla.

  4. pasando este valor a una varible, para despues compararla en un select…como quedaria???????????????

  5. Muy bueno. Cada vez me sorprenden mas las funciones que tiene PHP para simplificar todo, se nota lo moderno que es a pesar de su edad.