¿Por qué debería almacenar tanto REMOTE como FORWARDED como IP del usuario?

Actualmente recibo la IP de usr así:

if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) ){ $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } elseif ( isset($_SERVER['REMOTE_ADDR']) ) { $ip = $_SERVER['REMOTE_ADDR']; } // IPs +----+----------------+-------------+ | id | user_ip | date_time | +----+----------------+-------------+ | 1 | 43.12.9.9 | 1468070172 | | 2 | 173.3.0.1 | 1468070667 | +----+----------------+-------------+ 

Pero ahora, leo esto aquí :

si va a guardar $_SERVER['HTTP_X_FORWARDED_FOR'] , asegúrese de guardar también el $_SERVER['REMOTE_ADDR'] . Por ejemplo, guardando ambos valores en diferentes campos en su base de datos.

Así que estoy cambiando mi código a esto:

 $remote_add = $_SERVER['REMOTE_ADDR']; // I don't use isset() for this becase it is always set $http_x_forwarded_for = isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : null; // IPs +----+----------------+----------------+-------------+ | id | remote | forwarded | date_time | +----+----------------+----------------+-------------+ | 1 | 43.12.9.9 | NULL | 1468070172 | | 2 | 93.35.40.1 | 173.3.0.1 | 1468070667 | +----+----------------+----------------+-------------+ 

Ok, lo que estoy haciendo es correcto? Estoy preguntando esto porque algunos progtwigdores profesionales me dicen que lo que haces es inútil y lo que necesitas es solo una columna como IP del usuario. Bueno, ¿puede alguien por favor aclararme? ¿Cómo puedo obtener la IP del usuario correctamente?


Mi código final:

 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 $header){ $header = trim($header); // just to be safe if (filter_var($header, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false){ $header = $header; } } } } $user_ip = $_SERVER['REMOTE_ADDR']; // IPs +----+----------------+----------------+-------------+ | id | user_ip | header | date_time | +----+----------------+----------------+-------------+ | 1 | 43.12.9.9 | NULL | 1468070172 | | 2 | 93.35.40.1 | 173.3.0.1 | 1468070667 | +----+----------------+----------------+-------------+ 

En una solicitud HTTP, alguien puede suplantar CUALQUIER información, a excepción de la dirección remota. No puede completar el saludo de tcp sin tener realmente acceso al módem en esa dirección de IP, o una computadora detrás de ese módem / enrutador. La tecla REMOTE_ADDR siempre se establece en el dispositivo que realizó la conexión a su servidor. En algunos casos, ese dispositivo es el proxy utilizado por el usuario.

El encabezado HTTP_X_FORWARDED_FOR es un encabezado que los proxies agradables usan para indicar la dirección IP de origen que ordenó al proxy cargar una página en su nombre. Sin embargo, este encabezado puede ser falso. Alguien puede enviar cualquier información en este encabezado, incluyendo cosas divertidas como 127.0.0.1 (localhost), o incluso html o scripts para servidores que solo suponen que ese campo solo puede contener números y puntos, o incluso sentencias sql sin formato para servidores que no lo hacen usa consultas preparadas para insertar esto.


La única información que se garantiza correcta es la dirección IP remota, pero no necesariamente es la dirección IP del usuario. Si la dirección IP remota es un proxy, el registro de la dirección IP remota podría permitirle contactar al propietario del proxy remoto de un comportamiento fraudulento, para permitirles buscar en sus registros qué IP realmente realizó esa solicitud. En algunos casos, la IP reenviada puede ahorrarle tiempo en los casos en que el proxy no estaba destinado a ocultar la identidad de la persona que usó el proxy, lo que le permitiría tomar algunas medidas contra esa ip, en lugar del proxy en sí.

Hacer una suposición REMOTE_ADDR , al usar a veces el encabezado HTTP_X_FORWARDED_FOR y, a veces utilizando REMOTE_ADDR , dará como resultado datos inutilizables. No puede saber en qué datos puede confiar y en qué datos no puede confiar.

Estoy preguntando esto porque algunos progtwigdores profesionales me dicen que lo que haces es inútil y lo que necesitas es solo una columna como IP del usuario.

Si lo que estás haciendo es inútil depende completamente de para qué lo estás usando. Si está visualizando el campo reenviado, recuerde escaparse correctamente de todos los caracteres especiales para el contexto en el que lo visualiza. Si solo almacenara una ip, sería la dirección IP remota, ignorando por completo el encabezado HTTP_X_FORWARDED_FOR . Es la única información en la que puede confiar por completo.