TL; DR: Voglio sapere se devo memorizzare REMOTE-ADDRESS e X-FORWARDED-FOR o REMOTE-ADDRESS o X-FORWARDED-FOR?
Dettagli ...
Ecco alcune teorie per ottenere l'IP dell'utente
Theory1: se non usi un load balancer, usa REMOTE_ADDR
. Se si utilizza un servizio di bilanciamento del carico, utilizzare qualsiasi cosa utilizzi. Nel 99% dei casi sembra essere HTTP_X_FORWARDED_FOR
. Quindi:
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: ci sono altre informazioni di intestazione HTTP (cioè $_SERVER['HTTP_...]
) che potrebbero contenere l'IP. Quindi:
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: Memorizza entrambi uno di $_SERVER['HTTP_...]
e $_SERVER['REMOTE_ADDR']
. Quindi ci sono due variabili:
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);
}
}
}
}
}
Beh, onestamente sono un po 'confuso. Quante colonne (nel database) devo memorizzare l'IP dell'utente? Voglio dire, dovrei memorizzare sia REMOTE_ADDR
che HTTP_...
? O solo uno di loro?
In realtà ho una query che inserisce l'IP dell'utente per ogni pagina caricata nel database. Quindi quella query verrà eseguita ogni volta prima del caricamento della pagina. Sicuramente una INSERT
query (ogni volta per ogni richiesta e ogni utente) ha un costo. Quindi non voglio che sia inutile. Voglio dire che voglio memorizzare un IP corretto / reale o almeno voglio fare il miglior lavoro che è possibile rilevare l'IP * dell'utente.
* Quando un utente utilizza un proxy come HSS, rilevarlo sarebbe impossibile. Ecco perché ho detto "almeno".
Ok, quale teoria è la migliore?