¿Cómo puedo rastrear las direcciones IP para bloquear usuarios malintencionados?

1

TL; DR: Quiero saber si debo guardar tanto REMOTE-ADDRESS como X-FORWARDED-FOR o REMOTE-ADDRESS o X-FORWARDED-FOR?

Detalles ...

Aquí hay algunas teorías para obtener la IP del usuario

Theory1: Si no usa un equilibrador de carga, use REMOTE_ADDR . Si usa un equilibrador de carga, use lo que use. En el 99% de los casos parece ser HTTP_X_FORWARDED_FOR . Entonces:

function get_ip_address(){
    $id = '';
    if (isset($_SERVER['REMOTE_ADDR']))
        $ip = $_SERVER['REMOTE_ADDR']; 
    else if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; 
    else
        $ip = 'UNKNOWN';
    return $ip;
}

Theory2: Hay otra información de encabezado HTTP (es decir, $_SERVER['HTTP_...] ) que puede contener la IP. Entonces:

function get_ip_address(){
    foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key){
        if (array_key_exists($key, $_SERVER) === true){
            foreach (explode(',', $_SERVER[$key]) as $ip){
                $ip = trim($ip); // just to be safe
                if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false){
                    return $ip;
                }
            }
        }
    }
}

Theory3: Almacenar tanto uno de $_SERVER['HTTP_...] como $_SERVER['REMOTE_ADDR'] . Así que hay dos variables:

function get_ip_address(){
    foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED') as $key){
        if (array_key_exists($key, $_SERVER) === true){
            foreach (explode(',', $_SERVER[$key]) as $ip2){
                $ip2 = trim($ip2); // just to be safe
                if (filter_var($ip2, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false){
                    $ip1 = $_SERVER['REMOTE_ADDR'];
                    return array($ip2, ip1);
                }
            }
        }
    }
}

Honestamente estoy un poco confundido. ¿Cuántas columnas (en la base de datos) necesito para almacenar la IP del usuario? Quiero decir, ¿debería almacenar tanto REMOTE_ADDR como HTTP_... ? ¿O solo uno de ellos?

En realidad tengo una consulta que inserta la IP del usuario por cada página que se carga en la base de datos. Así que esa consulta se ejecutará cada vez antes de cargar la página. Seguramente una consulta INSERT (cada vez para cada solicitud y cada usuario) tiene un costo. Así que no quiero que sea inútil. Quiero decir que quiero almacenar una IP correcta / real o al menos quiero hacer el mejor trabajo posible para detectar la IP * del usuario.

* Cuando un usuario usa un proxy como HSS, entonces sería imposible detectarlo. Por eso dije "al menos".

Ok, ¿cuál es la mejor teoría?

    
pregunta Martin AJ 09.07.2016 - 00:16
fuente

1 respuesta

1

Debe saber en qué servidores proxy confía y en qué encabezados confiar (si los hay) para cada uno de ellos.

Por ejemplo, sabe que su equilibrador de carga usa X-FORWARDED-FOR para que pueda confiar en el valor más a la derecha que se proporciona a su servidor web en este encabezado.

Su equilibrador de carga también necesitará saber en qué IP confiar. Por ejemplo, puede confiar en RFC 1918 IP privadas. También puede querer que confíe en ciertas direcciones IP públicas si, bueno ... si confía en ellas.

Al confiar en ellos, probablemente querrá eliminarlos de la cadena de IP que son candidatos para el almacenamiento.

Tan pronto como llegue a la primera IP no confiable de la cadena, deberá guardarla como la IP remota para la conexión. La razón es porque cualquiera puede establecer X-FORWARDED-FOR dentro de su solicitud HTTP. Si este REMOTE_ADDR no está en su lista de confianza para X-FORWARDED-FOR , no tiene por qué confiar en el encabezado.

Esto puede ser complicado si confía en servidores de Internet arbitrarios con diferentes encabezados de confianza para cada uno.

Lo anterior es un enfoque genérico para encontrar la conexión real que solicita su página. Sin embargo, si está intentando realizar un seguimiento de usuarios malintencionados, es posible que solo desee recopilar cualquier IP en cualquier encabezado, así como REMOTE_ADDR y luego almacenar múltiples IP para cada conexión. Luego, si comienzan a hacer algo "malo" en su sistema, puede agregar una marca negra en todas esas IP.

Una vez que se hayan otorgado tantos puntos negros, su sistema podría comenzar a bloquear las conexiones con esa IP en REMOTE_ADDR o en un encabezado HTTP HTTP. Sin embargo, debe tener en cuenta que un usuario malintencionado puede intentar incluir en la lista negra otras IP en un ataque de denegación de servicio. Por lo tanto, vuelve a mi primera descripción de solo confiar en ciertos hosts.

Por supuesto, un determinado usuario malintencionado siempre cambiará de host cuando sienta la necesidad de atacar su sistema. p.ej. por Tor, por servicios VPN oa través de su botnet. Es algo difícil de lograr, por lo que puede considerar otros métodos de bloqueo de usuarios malintencionados, por ejemplo, obligándoles a registrarse con una cuenta antes de usar su sistema, que está verificado por SMS. Esto agrega una barrera suficientemente alta para bloquear a todos los usuarios maliciosos, excepto a los más determinados.

    
respondido por el SilverlightFox 11.07.2016 - 16:19
fuente

Lea otras preguntas en las etiquetas