Ci sono due approcci:
Primo approccio:
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 |
+----+----------------+-------------+
Secondo approccio:
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 |
+----+----------------+----------------+-------------+
Finora, stavo usando il primo approccio, ma un utente può semplicemente impostare un valore fasullo su uno di quegli header HTTP_...
e in tal caso memorizzerò un valore errato come IP dell'utente. Ma nel secondo approccio, memorizzerò entrambi REMOTE_ADDR
e uno di quei HTTP_...
headers (quello che non è vuoto) ., Come sai che nessuno può cambiare il valore di REMOTE_ADDR
, quindi suppongo che il secondo approccio sarà molto meglio.
Quindi pensi qual è il migliore?