Hay dos enfoques:
Primer enfoque:
if (isset($_SERVER['HTTP_CLIENT_IP']))
$user_ip = $_SERVER['HTTP_CLIENT_IP'];
else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
$user_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_X_FORWARDED']))
$user_ip = $_SERVER['HTTP_X_FORWARDED'];
else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
$user_ip = $_SERVER['HTTP_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_FORWARDED']))
$user_ip = $_SERVER['HTTP_FORWARDED'];
else if(isset($_SERVER['REMOTE_ADDR']))
$user_ip = $_SERVER['REMOTE_ADDR'];
else
$user_ip = NULL;
// IPs
+----+----------------+-------------+
| id | user_ip | date_time |
+----+----------------+-------------+
| 1 | 43.12.9.9 | 1468070172 |
| 2 | 173.3.0.1 | 1468070667 |
+----+----------------+-------------+
Segundo enfoque:
if (isset($_SERVER['HTTP_CLIENT_IP']))
$header = $_SERVER['HTTP_CLIENT_IP'];
else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
$header = $_SERVER['HTTP_X_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_X_FORWARDED']))
$header = $_SERVER['HTTP_X_FORWARDED'];
else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
$header = $_SERVER['HTTP_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_FORWARDED']))
$header = $_SERVER['HTTP_FORWARDED'];
else
$header = NULL;
$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 |
+----+----------------+----------------+-------------+
Hasta ahora, estaba usando el primer enfoque, pero un usuario simplemente puede establecer un valor falso en uno de esos encabezados HTTP_...
y, en ese caso, almacenaré un valor incorrecto como IP del usuario. Pero en el segundo enfoque, almacenaré REMOTE_ADDR
y uno de esos HTTP_...
headers (el que no está vacío) ., Como saben, nadie puede cambiar el valor de REMOTE_ADDR
, así que supongo que el segundo enfoque será mucho mejor.
Entonces, ¿crees cuál es mejor?