Ir al contenido


Foto

Como conozco las ips de mis clientes


  • Por favor identifícate para responder
16 respuestas en este tema

#1 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 22 enero 2009 - 03:04

Leyendo un hilo de eduarcol en el que mencionaba que tenia las ips de sus clientes dadas de alta en no-ip, se me ocurrió que a alguien le podía interesar la solución que le di yo al mismo problema. Es realmente sencilla y se puede integrar fácilmente dentro de otra aplicación.

El código se divide en dos partes, una en delphi y otra en php.

La parte de php es esta (el archivo lo llamo agent.php):


php
  1. <?php
  2.   Main();
  3. ?>
  4.  
  5. <?php
  6.  
  7. function remoteip()   
  8. {
  9. $ip = 0;
  10. if (!empty($_SERVER["HTTP_CLIENT_IP"]))
  11.   $ip = $_SERVER["HTTP_CLIENT_IP"];
  12. if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))   
  13. {
  14.   $iplist = explode(", ", $_SERVER["HTTP_X_FORWARDED_FOR"]);
  15.   if ($ip)   
  16.   {
  17.   array_unshift($iplist, $ip);
  18.   $ip = 0;
  19.   }
  20.   foreach($iplist as $v)
  21.     if (!eregi("^(192\.168|172\.16|10|224|240|127|0)\.", $v))
  22.       return $v;
  23. }
  24. return ($ip) ? $ip : $_SERVER["REMOTE_ADDR"];
  25. }
  26.  
  27. function testport($port, $timeout = 30)
  28. { 
  29. $host = remoteip();
  30. $fp = fsockopen($host,$port,$errno,$errstr,$timeout);
  31. if($fp)
  32. {
  33.   echo 'open';
  34.   fclose($fp);
  35. }
  36. else
  37. {
  38.   echo 'close';
  39. }
  40. flush();
  41. }
  42.  
  43. function updateip()
  44. {
  45. $host = remoteip();
  46. $con = mysql_connect("localhost","usuario","password");
  47. if ($con)
  48. {
  49.   mysql_select_db("agent", $con);
  50.   $sql="INSERT INTO iplist (uid, ip, fecha) VALUES ($_GET[uid],'$host',NOW())";
  51.   if (!mysql_query($sql,$con))
  52.   {
  53.   if (mysql_errno() == 1062)
  54.   {
  55.     $sql="UPDATE iplist SET ip='$host',fecha=NOW() WHERE uid=$_GET[uid]";
  56.     if (mysql_query($sql,$con))
  57.     {
  58.     echo 'OK';
  59.     }
  60.   }
  61.   } else
  62.   {
  63.   echo 'OK';
  64.   }
  65.   mysql_close($con);
  66. }
  67. }
  68.  
  69. function Main()
  70. { 
  71. $myself = $_SERVER['PHPSELF'];
  72. if (isset($_GET['cmd']))
  73. {
  74.   $cmd = $_GET['cmd'];
  75.   if ($cmd == 'getip')
  76.   {
  77.   echo remoteip();
  78.   } else if (($cmd == 'testport') && isset($_GET['port']))
  79.   {
  80.   if (isset($_GET['timeout']))
  81.   {
  82.     testport($_GET['port'],$_GET['timeout']);
  83.   } else
  84.   {
  85.     testport($_GET['port'],30);
  86.   }
  87.   } else if (($cmd == 'updateip') && isset($_GET['uid']))
  88.   {
  89.   if (is_numeric($_GET['uid']))
  90.   {
  91.     updateip();
  92.   }
  93.   }
  94. }
  95. }
  96.  
  97. ?>



Y las tablas que uso (mysql) son estas:



mysql
  1. CREATE TABLE IF NOT EXISTS `clientes` (
  2.   `uid` int(11) unsigned NOT NULL,
  3.   `Nombre` varchar(64) collate latin1_spanish_ci NOT NULL,
  4.   `Telefono` varchar(9) collate latin1_spanish_ci default NULL,
  5.   PRIMARY KEY  (`uid`)
  6. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci;
  7.  
  8. CREATE TABLE IF NOT EXISTS `iplist` (
  9.   `uid` int(11) NOT NULL,
  10.   `ip` varchar(15) collate latin1_spanish_ci NOT NULL,
  11.   `fecha` datetime NOT NULL,
  12.   PRIMARY KEY  (`uid`)
  13. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci;



Básicamente lo que hace el código en php es que cada vez que alguien accede a esa pagina, pasándole como parámetro el numero de cliente, graba la ip en la tabla correspondiente.

Así que el código en delphi es tan sencillo como este:


delphi
  1. uses WinInet, IniFiles;
  2.  
  3. const
  4.   Version = '1.0';
  5.   Url = 'http://www.mipagina.com/agent.php';
  6.  
  7. function SendCmd(Cmd: String): String;
  8. var
  9.   hNet: HINTERNET;
  10.   hUrl: HINTERNET;
  11.   Buffer: Array[0..256] of Char;
  12.   BytesRead: DWORD;
  13. begin
  14.   Result:= EmptyStr;
  15.   hNet:= InternetOpen('agent', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  16.   if (hNet <> nil) then
  17.   begin
  18.     hUrl := InternetOpenUrl(hNet, PChar(Url + Cmd), nil, 0, INTERNET_FLAG_RELOAD, 0);
  19.     if (hUrl <> nil) then
  20.     begin
  21.       FillChar(Buffer,Sizeof(Buffer),0);
  22.       if InternetReadFile(hUrl, @Buffer, sizeof(Buffer)-1, BytesRead) then
  23.         Result:= Trim(Copy(Buffer,1,BytesRead));
  24.       InternetCloseHandle(hUrl);
  25.     end;
  26.     InternetCloseHandle(hNet);
  27.   end;
  28. end;
  29.  
  30. // Solo tenemos que llamar a esta función periódicamente para mantener la ip actualizada.
  31. // Uid es el identificador del cliente, el mismo de la tabla de clientes
  32. SendCmd('?cmd=updateip&uid=' + IntToStr(Uid));



Ahora solo falta mostrar la lista en una bonita pagina web, pero lejos de las miradas de los curiosos.

Nota: Si le encontráis algún error al código es porque he tenido que cortar algunas partes relacionadas con mi trabajo, y puede que se me fuera la tijera  :p me avisáis y lo corrijo.
  • 0

#2 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 22 enero 2009 - 03:16

Gracias Domingo.

Me tomé el atrevimiento de tomar parte de tu código para utilizarlo en un portal que estoy desarrollando.

Tengo un administrador de sesiones, con él puedo saber qué usuarios han iniciado una sesión. Llevo una bitácora de accesos y también puedo bloquear (si es necesario) el acceso de algún usuario en particular.

La parte que me hacía falta era tomar su dirección IP para tener más información acerca de quién entra y desde que dirección accede.

Gracias a esta función quedo resuelto.



php
  1. function remoteip()   
  2. {
  3. $ip = 0;
  4. if (!empty($_SERVER["HTTP_CLIENT_IP"]))
  5.   $ip = $_SERVER["HTTP_CLIENT_IP"];
  6. if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))   
  7. {
  8.   $iplist = explode(", ", $_SERVER["HTTP_X_FORWARDED_FOR"]);
  9.   if ($ip)   
  10.   {
  11.   array_unshift($iplist, $ip);
  12.   $ip = 0;
  13.   }
  14.   foreach($iplist as $v)
  15.     if (!eregi("^(192\.168|172\.16|10|224|240|127|0)\.", $v))
  16.       return $v;
  17. }
  18. return ($ip) ? $ip : $_SERVER["REMOTE_ADDR"];
  19. }



Ahora puedo bloquear también por rangos de direcciones IP.

Nuevamente gracias, me resultó muy útil.

Saludos



  • 0

#3 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 22 enero 2009 - 04:03

o sea, a ver si entiendo, tu agarrastes y te hicistes tu propio no-ip jejeje, es lo bueno de ser inteligente.
  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 22 enero 2009 - 04:10

Hola, sólo un detalle, en el foro existen las etiquetas PHP y MySQL al igual que SQL, lo podeis usar así:

PHP

[ code=php ] codigo [ /code ]

MySQL

[ code=mysql ] sentencia [ /code ]

sin los espacios ;)

Saludos.

PD. Sí, Sí, ya pondré los botoncitos :D
  • 0

#5 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 22 enero 2009 - 04:16

o sea, a ver si entiendo, tu agarrastes y te hicistes tu propio no-ip jejeje, es lo bueno de ser inteligente.


La conversación fue mas o menos así:
Yo: Deberíamos dar de alta las ips de nuestros clientes en no-ip
Mi jefe: Eso es una tontería, además quien va a ocuparse de mantener las cuentas de no-ip ... etc
Yo: Vale, ya me busco yo la vida.

:D :D :D
  • 0

#6 casi

casi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 191 mensajes

Escrito 30 abril 2009 - 02:56

Si me hubiese pasado a mí­, la conversación serí­a algo diferente:

Yo: Deberí­amos dar de alta las ips de nuestros clientes en no-ip
Mi jefe: Eso es una tonterí­a, además quien va a ocuparse de mantener las cuentas de no-ip ... etc
Yo: Vale, ya me busco yo la vida, ¿dónde tengo el email de seoane?.
:D :D :D


  • 0

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.455 mensajes
  • LocationMéxico

Escrito 30 abril 2009 - 02:59

Si me hubiese pasado a mí­, la conversación serí­a algo diferente:


Yo: Deberí­amos dar de alta las ips de nuestros clientes en no-ip
Mi jefe: Eso es una tonterí­a, además quien va a ocuparse de mantener las cuentas de no-ip ... etc
Yo: Vale, ya me busco yo la vida, ¿dónde tengo el email de seoane?.
:D :D :D


:D :D :D, buena esa amigo casi, siempre es bueno contar con los correos de quien sabe y mas si cae en domingo :D  :p

Salud OS

[off-topic]que gusto verte por aqui de vez en vez[/off-topic]
  • 0

#8 casi

casi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 191 mensajes

Escrito 30 abril 2009 - 03:19

[off-topic]que gusto verte por aqui de vez en vez[/off-topic]


Es que no se puede perder el contacto con los amigos  :)

  • 0

#9 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 30 abril 2009 - 03:23

.....

:D :D :D, buena esa amigo casi, siempre es bueno contar con los correos de quien sabe y mas si cae en domingo :D  :p

Salud OS
...


Precisamente de él es de quien hablamos !!!  :D  :p  :$ (ya pues, no dije nada)
  • 0

#10 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 30 abril 2009 - 03:28

Precisamente de él es de quien hablamos !!!  :D  :p  :$ (ya pues, no dije nada)


^o|
  • 0

#11 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.455 mensajes
  • LocationMéxico

Escrito 30 abril 2009 - 03:30


.....

:D :D :D, buena esa amigo casi, siempre es bueno contar con los correos de quien sabe y mas si cae en domingo :D  :p

Salud OS
...


Precisamente de él es de quien hablamos !!!  :D  :p  :$ (ya pues, no dije nada)


:D :D :D

Amiguita, es que estaba pensando que el dia que necesitaras el correo cayera en domingo jajajajaja

Salud OS
  • 0

#12 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 30 abril 2009 - 03:31



.....

:D :D :D, buena esa amigo casi, siempre es bueno contar con los correos de quien sabe y mas si cae en domingo :D  :p

Salud OS
...


Precisamente de él es de quien hablamos !!!  :D  :p  :$ (ya pues, no dije nada)


:D :D :D

Amiguita, es que estaba pensando que el dia que necesitaras el correo cayera en domingo jajajajaja

Salud OS


Jejejeje, lo sé, pero quedó de perlas  :p  :D
  • 0

#13 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 30 abril 2009 - 03:44

Pues ahora que resucitan el tema, así­ es como queda la web con las ips:

Imagen Enviada

  • 0

#14 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.455 mensajes
  • LocationMéxico

Escrito 30 abril 2009 - 03:58

Hey amigo seaone, que bien que quedo esa aplicación, y eso que solo nos muestras el listado de Ip's  :D

Salud OS
  • 0

#15 pcicom

pcicom

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 267 mensajes
  • LocationMéxico

Escrito 30 abril 2009 - 10:53

Saludos SEOANE,,

Oye y cual es la principal funcion de tener las IPS de tus clientes, son para que te puedas conectar a ellos, o a algun SERVIDOR,  me gustaria saber un poco de tu necesidad. resulta interesante.

:)


Esta genial, solo habria que optimizar para no repetir constantemente el ENVIO del comando de actualizacon, lo que hariamos seria crear una variable global que grabe el valor de la IP enviada, y modificando el codigo PHP para que por medio de un parametro nos devuelva la IP, una vez conocida la IP la comparariamos con la IP Enviada en caso que fuera distinta entonces enviariamos el comando para que actualizara la IP y asignariamos la IP a la variable GLOBAL.

Asi no le meteriamos CARGA a la BD..

Saludos..







  • 0

#16 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 01 mayo 2009 - 06:43

Oye y cual es la principal funcion de tener las IPS de tus clientes, son para que te puedas conectar a ellos, o a algun SERVIDOR,  me gustaria saber un poco de tu necesidad. resulta interesante.


Pues algunos tienen instalado vnc, otros tienen abierto el puerto de la base de datos, pero en la mayorí­a de los casos necesitamos saber las ips para configurar la comunicación entre las centrales y las tiendas. Estas ips son fijas, o al menos se contrataron así­*, y no deberí­an de cambiar nunca pero a veces hay problemas y tener controladas todas la ips ayuda a localizar el problema mas rápidamente.

*A un cliente los de telefónica le llegaron a decir que no le podí­an poner una ip fija que ahora solo contrataban Ips seudofijas  :| ... lo que hay que oí­r  :D

Esta genial, solo habria que optimizar para no repetir constantemente el ENVIO del comando de actualizacon, lo que hariamos seria crear una variable global que grabe el valor de la IP enviada, y modificando el codigo PHP para que por medio de un parametro nos devuelva la IP, una vez conocida la IP la comparariamos con la IP Enviada en caso que fuera distinta entonces enviariamos el comando para que actualizara la IP y asignariamos la IP a la variable GLOBAL.


En principio no es un numero lo bastante grande para que mi alojamiento se vea sobrecargado, por eso lo mantengo lo mas simple posible. En caso de cambiarlo, lo primero que harí­a seria utilizar algún tipo de cifrado o autenticación para evitar que algún gracioso pueda utilizar una identificación que no le corresponde.
  • 0

#17 pcicom

pcicom

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 267 mensajes
  • LocationMéxico

Escrito 05 mayo 2009 - 08:34

Generalmente yo tengo el mismo de los casos, en los cuales requiero conocer las IPs de mis CLIENTES, pero a todos mis clientes les tengo implementado servidores LINUX para mantener enlaces entre sucursales, lo que me facilita mucho un codigo similar al que tu escribiste,

http://MIDOMINIO.COM/checkip.php


<?
$id=  $_GET[id];
$ip  = getenv("REMOTE_ADDR");
if (!isset($id)) {
echo "$ip";
      exit;
}

require 'configuracionmysql.php';
$link = mysql_connect($dbhost, $dbuser, $dbpass);
$qry_update = "UPDATE clientes SET ip='$ip',ip_fecha=current_timestamp WHERE cliente=$id";
$result = mysql_db_query($dbname, $qry_update, $link);
mysql_close($link);
?>


Y un archivo que ejecuto con un CRON cada minuto 1,16,31,45 escrito en PERL el cual me actualiza la IP de mi cliente al cual le tengo asignado su ID..

[perl]
#!/usr/bin/perl -w
unlink("/var/log/ipnew");

system("lwp-request -a http://MIDOMINIO.COM/checkip.php >/var/log/ipnew");
#Detectar por INTERFASE
$cambios = system("diff /var/log/ipnew /var/log/ipold >/dev/null");
if ($cambios == 0) {
  exit;
}
system("cp /var/log/ipnew /var/log/ipold");
system("lwp-request -a http://MIDOMINIO.COM...p.php?id=AB7683 >/var/log/ipnew");
[/perl]


Esto lo tengo implementado desde YA hace casi 5 añitos.. y me ha ayudado enormemente..

  • 0




IP.Board spam blocked by CleanTalk.