2つの方法があります。
最初のアプローチ:
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 |
+----+----------------+-------------+
2番目のアプローチ:
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 |
+----+----------------+----------------+-------------+
これまでのところ、私は最初のアプローチを使用していましたが、ユーザーは偽の値をそれらのHTTP_...
ヘッダーの1つに単純に設定でき、その場合、ユーザーのIPとして間違った値を格納します。しかし、2番目のアプローチでは、REMOTE_ADDR
とそれらのHTTP_...
ヘッダーの1つ(空ではないヘッダー)を保存します、あなたが知っているように、誰もREMOTE_ADDR
の値を変更できないため、2番目のアプローチの方がはるかに優れていると思います。
どちらが良いと思いますか?
2つ目は1つ目と比較して間違いなく優れています。しかし、平均的なコンピュータユーザーにとって、ヘッダーを変更するよりもVPNを認識して身元を隠すプログラムが多いため、どのような種類のユーザーを扱っているかはわかりません。
私の意見では、平均的なユーザーにとっては、VPNプログラムをダウンロードする方が簡単なので、ヘッダーの方が信頼性が高いと思います。本当にIPを知る必要がある場合は、両方を保存する方が良いと思います。
また、ユーザーが自分のIDを隠すまで何をしているのかをユーザーが知っている場合、ヘッダーとリモートの両方を認証できないことに注意してください。
ユーザーを特定するためにユーザーについて収集できる情報は他にもたくさんありますが、私が言ったように、それはすべてユーザーが誰であり、その情報で何をしようとしているのかによって異なります。
考えるべきことがいくつかあります!