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;
}
?>