Obtener la IP del navegante con PHP

26 abril, 2009 por Mr. FotoPex Dejar una respuesta »

 

 

Las siguientes funciones pertenecen al plugin Check IP Behind Proxy de Ricardo Galli y como está en su Antiguo y abandonado blog de Ricardo Galli :-( , mejor lo guardamos para tenerlo mas a la mano.

La idea es obtener con php la "IP real" del usuario que visita tu página.

PHP:
  1. function isIPIn($ip,$net,$mask) {
  2.         $lnet=ip2long($net);
  3.         $lip=ip2long($ip);
  4.         $binnet=str_pad( decbin($lnet),32,"0","STR_PAD_LEFT" );
  5.         $firstpart=substr($binnet,0,$mask);
  6.         $binip=str_pad( decbin($lip),32,"0","STR_PAD_LEFT" );
  7.         $firstip=substr($binip,0,$mask);
  8.         return(strcmp($firstpart,$firstip)==0);
  9. }
  10.  
  11. function isPrivateIP($ip) {
  12.         $privates = array ("127.0.0.0/24", "10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16");
  13.         foreach ( $privates as $k ) {
  14.                 list($net,$mask)=split("/",$k);
  15.                 if (isIPIn($ip,$net,$mask)) {
  16.                         return true;
  17.                 }
  18.         }
  19.         return false;
  20. }
  21.  
  22. function check_ip_behind_proxy() {
  23.     $user_ip = $_SERVER["REMOTE_ADDR"];
  24.     if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
  25.         $user_ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
  26.     } else if (isset($_SERVER["HTTP_CLIENT_IP"])) {
  27.         $user_ip = $_SERVER["HTTP_CLIENT_IP"];
  28.     } else {
  29.         return $user_ip;
  30.     }
  31.     $ips = preg_split('/[, ]/', $user_ip);
  32.     foreach ($ips as $ip) {
  33.         if (preg_match('/^(\d{1,3}\.){3}\d{1,3}$/s', $ip)
  34.             && !isPrivateIP($ip) ) {
  35.             $user_ip = $ip;
  36.         }
  37.     }
  38.     return $user_ip;
  39. }
  40.  
  41. echo check_ip_behind_proxy();

Como puedes ver hicimos un pequeñisimo cambio en check_ip_behind_proxy(): se descomenta y elimina la variable obligatoria $user_ip.

Clic aquí para bajar el plugin completo compactado ó en texto.

PHP:
  1. <?php
  2. /*
  3. Plugin Name: Check IP Behind Proxy
  4. Plugin URI: http://mnm.uib.es/gallir/posts/2005/02/21/145/
  5. Description: Check for client public IP sent by proxies in HTTP headers
  6. Author: Ricardo Galli
  7. Version: 1.1
  8. Author URI: http://mnm.uib.es/gallir/
  9. License: GPL
  10. */
  11.  
  12. function isIPIn($ip,$net,$mask) {
  13.         $lnet=ip2long($net);
  14.         $lip=ip2long($ip);
  15.         $binnet=str_pad( decbin($lnet),32,"0","STR_PAD_LEFT" );
  16.         $firstpart=substr($binnet,0,$mask);
  17.         $binip=str_pad( decbin($lip),32,"0","STR_PAD_LEFT" );
  18.         $firstip=substr($binip,0,$mask);
  19.         return(strcmp($firstpart,$firstip)==0);
  20. }
  21.  
  22.  
  23. function isPrivateIP($ip) {
  24.         $privates = array ("127.0.0.0/24", "10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16");
  25.         foreach ( $privates as $k ) {
  26.                 list($net,$mask)=split("/",$k);
  27.                 if (isIPIn($ip,$net,$mask)) {
  28.                         return true;
  29.                 }
  30.         }
  31.         return false;
  32. }
  33.  
  34. function check_ip_behind_proxy($user_ip) {
  35.     //$user_ip = $_SERVER["REMOTE_ADDR"];
  36.     if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
  37.         $user_ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
  38.     } else if (isset($_SERVER["HTTP_CLIENT_IP"])) {
  39.         $user_ip = $_SERVER["HTTP_CLIENT_IP"];
  40.     } else {
  41.         return $user_ip;
  42.     }
  43.     $ips = preg_split('/[, ]/', $user_ip);
  44.     foreach ($ips as $ip) {
  45.         if (preg_match('/^(\d{1,3}\.){3}\d{1,3}$/s', $ip)
  46.             && !isPrivateIP($ip) ) {
  47.             $user_ip = $ip;
  48.         }
  49.     }
  50.     return $user_ip;
  51. }
  52.  
  53.  
  54. add_filter('pre_comment_user_ip','check_ip_behind_proxy');
  55.  
  56. ?>

Publicidad

Deja un comentario