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?