Autor Tema: Log en PHP implementando Geolocalización  (Leído 1491 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ELITE

  • The Communiter-
  • *
  • Mensajes: 6227
  • NEMO ME IMPUNE LACESSIT
Log en PHP implementando Geolocalización
« : enero 27, 2024, 04:41:45 am »
Este sería un ejemplo del tipo de topics que propongo en el post Le interesa a alguien intentar rescatar SVC ??

Hace ya mucho tiempo hice este pequeño pero muy buen log en PHP usando Geolocalización. Principalmente lo uso en sitios de mis clientes Wordpress (WP) ya que WP es muy atacado para buscar vulnerabilidades (Nunca me han vulnerado un sitio  :phew: )

Yo uso este tipo de Logs para registrar, principalmente algún Bot que quiera meterse donde no deba. A mi Geoplugin me funciona muy bien ya que lo corroboro con el Firewall y la verdad no me da fallos.

Código: [Seleccionar]
<?php
    
// Defino Zona horaria a usar
    
date_default_timezone_set("Europe/Paris");

    
// Quito las IPs que no quiero que se incluyan en el Log
    
$myIPs = ["185.313.469.299""375.213.269.99"];

    
// Extraigo la IP del cliente con esta función
    
function getIpAddress() {
        
$heads = ["HTTP_CLIENT_IP","HTTP_X_FORWARDED_FOR","HTTP_X_FORWARDED","HTTP_X_CLUSTER_CLIENT_IP","HTTP_FORWARDED_FOR","HTTP_FORWARDED","REMOTE_ADDR"];
        foreach(
$heads as $head){
            if(
array_key_exists($head$_SERVER)){
                foreach(
array_map("trim",explode(",",$_SERVER[$head])) as $ip){
                    if ( 
filter_var$ipFILTER_VALIDATE_IPFILTER_FLAG_NO_PRIV_RANGE FILTER_FLAG_NO_RES_RANGE ) !== false ) {
                        return 
$ip;
                    }
                }
            }
        }
        return 
"UNKNOWN";
    }
    
$ip getIpAddress();

    
// Aca hago el filtro de mis IPs a no tomar en cuenta
    
if (!in_array($ip$myIPs)) {
        
// Obtengo la Geolocation de la IP
        
function getGeolocation() {
            
$ip getIpAddress();
            
$data unserialize(@file_get_contents("http://www.geoplugin.net/php.gp?ip=".$ip));
            return 
$data;
        }
        
$location getGeolocation();

        
// Acá guardo en variables la información a escribir en el Log
        /* De la Global $_SERVER se coge toda la información
        que queramos, puedes ver todo lo que $_SERVER tiene con lo siguiente

        echo "<pre>";
            print_r($_SERVER);
        echo "</pre>";

        */
        
$date = new DateTime();
        
$date $date->format("d/m/Y H:i:s");
        
$country $location["geoplugin_countryName"]; // Pais
        
$city $location["geoplugin_city"]; // Ciudad
        
$method $_SERVER["REQUEST_METHOD"]; // POST o GET
        
$request $_SERVER["REQUEST_URI"]; // Que ruta visitan

        // Escribo en mi OCHOA_log.txt
        
$file "OCHOA_log.txt";
        
$log $date." - ".$ip." - ".$country." - ".$city." - ".$method." - ".$request." - "." * ";

        if (
is_writable($file)) {
            
$file fopen($file"a");
            
fwrite($file$log.PHP_EOL);
            
fclose($file);
        }
    }

    
/* Si por alguna razón (más que todo didactica) quieres ver ese log 
    en el navegador (pocos registros) puedes hacerlo así */
    
    // Lees tu log y buscas el separador de cada dato para crear un array
    // yo le puse como separarador un espacio un guion medio y otro espacio
    
$lines file("log.txt");

    foreach (
$lines as $line) {
        
$logs[] = explode(" - "$line);
    }

?>


Y el HTML para ver el log (Si son pocos registros) sería:

Código: [Seleccionar]
<!-- Haces una tabla sencilla  -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>OCHOA Log</title>
    <!-- Bootstrap -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
    <div class="container-fluid">
        <h3 class="text-center mb-3 mt-3">IPs LOG</h3>
        <table class="table table-striped">
            <thead>
                <tr>
                    <th scope="col">Fecha</th>
                    <th scope="col">IP</th>
                    <th scope="col">País</th>
                    <th scope="col">Ciudad</th>
                    <th scope="col">Method</th>
                    <th scope="col">URL</th>
                </tr>
            </thead>
            <tbody>
                <?php
                    
foreach ($logs as $log) {
                
?>

                <tr>
                    <td class="align-middle">
                        <?php echo $log[0]; ?>
                    </td>
                    <td class="align-middle">
                        <?php echo $log[1]; ?>
                    </td>
                    <td class="align-middle">
                        <?php echo $log[2]; ?>
                    </td>
                    <td class="align-middle">
                        <?php echo $log[3]; ?>
                    </td>
                    <td class="align-middle">
                        <?php echo $log[4]; ?>
                    </td>
                    <td class="align-middle">
                        <?php echo $log[5]; ?>
                    </td>
                </tr>
                <?php
                    
}
                
?>

            </tbody>
        </table>
    </div>
</body>
</html>

El resultado sería este. (Ese es mi resultado)



Como ya vieron, Geoplugin no es del 100% "confiable" pues puede que alguien cerca de ti use VPNs o que no registre (como en mi ejemplo) algunas ciudades, pero por lo demás nunca he visto una diferencia en el País de origen de una petición.

Para verificar el origen de una IP pueden usar: https://www.cual-es-mi-ip.net/geolocalizar-ip-mapa

Yo uso este Log en los 404 de todos mis sitios WP y me sirve para monitorizar y controlar trafico malicioso, luego en mi Firewall lo cotejo y lo bloqueo (si el cliente no tiene FW lo hago en el .htaccess) y como repito estoy muy contento con su funcionamiento, nunca me ha dado problemas y muchos usan mi log en muchos otros sitios también ya que lo he compartido mucho.

PD: Parece que el tag de Code, no deja poner comillas simples (') y me tocó poner comillas dobles (") en el script de PHP, pero en mi caso uso cada tipo de comilla conforme las buenas practicas lo proponen  :thumbsup:
« Última Modificación: junio 18, 2024, 11:00:49 am por ELITE »