Foros del Web » Programando para Internet » PHP »

Comparar IP's

Estas en el tema de Comparar IP's en el foro de PHP en Foros del Web. Buenas tardes: Tengo una base de datos donde las IP's aparecen con la MAC, ejemplo: 1.0.128.0/17 Y luego la variable PHP $_SERVER['REMOTE_ADDR'] que muestra la ...
  #1 (permalink)  
Antiguo 24/08/2015, 12:17
 
Fecha de Ingreso: abril-2009
Ubicación: En foros del web, normalmente en Web general, HTML y CSS.
Mensajes: 258
Antigüedad: 14 años, 11 meses
Puntos: 3
Comparar IP's

Buenas tardes:

Tengo una base de datos donde las IP's aparecen con la MAC, ejemplo: 1.0.128.0/17

Y luego la variable PHP $_SERVER['REMOTE_ADDR'] que muestra la IP sin la MAC, ejemplo: 1.0.128.28

¿Cómo puedo compararlas?, es decir, ¿cómo puedo saber si la IP x.x.x.x está dentro del rango x.x.x.x/mac?

Gracias. Un cordial saludo.
__________________
¿Por qué Anónimo?, porque como está el mundo no podemos considerarnos humanos...
  #2 (permalink)  
Antiguo 24/08/2015, 13:04
Avatar de lauser
Moderator Unix/Linux
 
Fecha de Ingreso: julio-2013
Ubicación: Odessa (Ukrania)
Mensajes: 3.278
Antigüedad: 10 años, 8 meses
Puntos: 401
Respuesta: Comparar IP's

Supongo que te refieres a la mask, porque la mac es otra cosa que no tiene nada que ver.

Cualquier calculadora subnet te dará el resultado que buscas.
__________________
Los usuarios que te responden, lo hacen altruistamente y sin ánimo de lucro con el único fin de ayudarte. Se paciente y agradecido.
-SOLOLINUX-
  #3 (permalink)  
Antiguo 24/08/2015, 13:11
 
Fecha de Ingreso: abril-2009
Ubicación: En foros del web, normalmente en Web general, HTML y CSS.
Mensajes: 258
Antigüedad: 14 años, 11 meses
Puntos: 3
Respuesta: Comparar IP's

Si, me he confundido, quería decir la máscara de red.

Respecto a la calculadora de subnet he encontrado varias cosas por internet, por ejemplo: http://www.subnet-calculator.com/

Pero no veo forma de integrarlo en mi script PHP, ¿no hay forma de hacerlo con PHP?, sino tendría que ver alguna de estas calculadoras que tenga una API.

Pero yo creo que igual con algún cálculo puedo obtener el rango de IP's que abarca x.x.x.x/mask, y desde ahí ver si una IP x.x.x.x está dentro de ese rango.

Disculpad mi ignorancia, pero mis conocimientos en redes son bastante limitados.
__________________
¿Por qué Anónimo?, porque como está el mundo no podemos considerarnos humanos...

Última edición por Anonimo12; 24/08/2015 a las 13:18
  #4 (permalink)  
Antiguo 24/08/2015, 14:00
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 8 años, 9 meses
Puntos: 263
Respuesta: Comparar IP's

algo asi seria:
Código PHP:
Ver original
  1. <?php
  2.  
  3. $ip_externa = $_SERVER['REMOTE_ADDR'];
  4. $ip_local = "127.0.0.1/17";
  5.  
  6. list($a, $b) = explode("/", $ip_local);
  7.  
  8. if($ip_externa != $a){
  9.     echo "Las iIPs no se parecen<br>";
  10. } else{
  11.     echo "Las IPs son identicas";
  12. }
  13.  
  14. ?>
claro configurando todos los parametros sobre tu consulta
__________________
[email protected]
HITCEL
  #5 (permalink)  
Antiguo 24/08/2015, 15:25
 
Fecha de Ingreso: abril-2009
Ubicación: En foros del web, normalmente en Web general, HTML y CSS.
Mensajes: 258
Antigüedad: 14 años, 11 meses
Puntos: 3
Respuesta: Comparar IP's

No compañero, eso no sirve.

La máscara indica un rango IP's, no una IP. Es decir, en este ejemplo: 84.1.1.0/24

Las IP's van desde la 84.1.1.0 hasta la 84.1.1.255

Necesito calcular de manera automática ese rango, y luego ver si una IP está dentro jeje
__________________
¿Por qué Anónimo?, porque como está el mundo no podemos considerarnos humanos...
  #6 (permalink)  
Antiguo 24/08/2015, 17:41
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 15 años, 11 meses
Puntos: 2534
Respuesta: Comparar IP's

Me imagino que leer algo de teoría de redes podría servirte, que siendo un tema muy especializado dudo que en php encuentres ayuda concreta.

Cita:
Iniciado por Anonimo12 Ver Mensaje
No compañero, eso no sirve.

La máscara indica un rango IP's, no una IP. Es decir, en este ejemplo: 84.1.1.0/24

Las IP's van desde la 84.1.1.0 hasta la 84.1.1.255

Necesito calcular de manera automática ese rango, y luego ver si una IP está dentro jeje
Que así como te expresas se nota que sabes mucho del tema.

Si no te sirve nada de lo que uno te pueda decir no te quedará de otra que hacerlo tu mismo.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 25/08/2015, 03:43
 
Fecha de Ingreso: abril-2009
Ubicación: En foros del web, normalmente en Web general, HTML y CSS.
Mensajes: 258
Antigüedad: 14 años, 11 meses
Puntos: 3
Respuesta: Comparar IP's

Ya veo, muy bien consultaré en el foro de redes. Es que los conceptos los entiendo, lo que no sé es hacer el cálculo de manera automática porque según los bits de la máscara el rango de IP's varía, entonces ahí es dónde me pierdo.

Pero gracias por la ayuda. Un cordial saludo.
__________________
¿Por qué Anónimo?, porque como está el mundo no podemos considerarnos humanos...
  #8 (permalink)  
Antiguo 25/08/2015, 12:49
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 10 meses
Puntos: 320
Respuesta: Comparar IP's

Código PHP:
Ver original
  1. <?php
  2.     class Ipv4Network {
  3.         /*/
  4.          * Bits fijos de cada clase.
  5.         /*/
  6.         const CLASS_A = 8;
  7.         const CLASS_B = 16;
  8.         const CLASS_C = 24;
  9.  
  10.         /*/
  11.          * Tipos de ip.
  12.         /*/
  13.         const IP_TYPE_NONE = "No pertenece";
  14.         const IP_TYPE_NETWORK = "Es una direccion de red";
  15.         const IP_TYPE_HOST = "Es un host";
  16.         const IP_TYPE_BROADCAST = "Es un broadcast";
  17.  
  18.         /*/
  19.          * Bits de la clase actual.
  20.         /*/
  21.         private $bClass;
  22.         /*/
  23.          * Bits de la mascara actual, debe ser mayor o igual a $bClass.
  24.         /*/
  25.         private $mask;
  26.         /*/
  27.          * Direccion de red completa.
  28.         /*/
  29.         private $network;
  30.         /*/
  31.          * Representacion binaria de la red.
  32.         /*/
  33.         private $bNetwork;
  34.  
  35.         private function toBinary($ip, $bits = 8) {
  36.             $binary = "";
  37.             if($bits > 0) {
  38.                 foreach(explode(".", $ip) as $part)
  39.                     $binary .= sprintf('%0'.$bits.'d', decbin($part));
  40.             }
  41.  
  42.             return $binary;
  43.         }
  44.  
  45.         public function __construct($network, $mask, $bClass) {
  46.             $this->mask = $mask;
  47.             $this->bClass = $bClass;
  48.             $this->network = $network;
  49.             $this->bNetwork = $this->toBinary($network);
  50.         }
  51.  
  52.         public function getType($ip) {
  53.             $ipBinary = $this->toBinary($ip);
  54.            
  55.             if(substr($this->bNetwork, 0, $this->bClass) !== substr($ipBinary, 0, $this->bClass))
  56.                 return self::IP_TYPE_NONE;
  57.            
  58.             $ipBinary = substr($ipBinary, $this->bClass);
  59.  
  60.             $subnetBits = $this->mask - $this->bClass;
  61.             $hostsBits = 32 - $this->mask;
  62.             $subnetCount = pow(2, $subnetBits);
  63.            
  64.             $hostBase = $this->toBinary(0, $hostsBits);
  65.             for($sNro = 0; $sNro < $subnetCount; $sNro++) {
  66.                 $subnet = $this->toBinary($sNro, $subnetBits);
  67.                 $broad = $subnet.$this->toBinary(bindec($hostBase) + pow(2, $hostsBits) - 1, $hostsBits);
  68.                
  69.                 if($ipBinary === $subnet.$hostBase)
  70.                     return self::IP_TYPE_NETWORK;
  71.                 elseif($ipBinary === $broad)
  72.                     return self::IP_TYPE_BROADCAST;
  73.                 elseif($ipBinary < $broad)
  74.                     return self::IP_TYPE_HOST;
  75.             }
  76.         }
  77.     }
  78.  
  79.     $ipv4Net = new Ipv4Network("192.168.1.0", 25, Ipv4Network::CLASS_C);
  80.     echo $ipv4Net->getType("192.168.1.0")."<br>";
  81.     echo $ipv4Net->getType("192.168.1.255")."<br>";
  82.     echo $ipv4Net->getType("192.168.1.127")."<br>";
  83.     echo $ipv4Net->getType("192.168.1.128")."<br>";
  84.     echo $ipv4Net->getType("192.168.1.120")."<br>";
  85.     echo $ipv4Net->getType("192.168.1.220")."<br>";
  86.     echo $ipv4Net->getType("191.168.1.220")."<br>";

Arme ese codigo, lo que no recuerdo ahora, es si por ejemplo el subnetting de:
192.168.1.0/25
es el mismo que el de:
192.168.1.1/25

si es lo mismo, entonces el codigo te sirve, sino hay que ajustar la linea 64 para que en vez de partir del numero 0, arranque desde el que corresponda.
tampoco recuerdo que pasaba en esos casos con las direcciones sobrantes al final, si quedaban inutilizadas o que pasaba.

En fin, te puede servir como orientacion de todas formas
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Etiquetas: variable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:44.