web-dev-qa-db-ja.com

ユーザーのIPを取得するための最良のアプローチ

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番目のアプローチの方がはるかに優れていると思います。

どちらが良いと思いますか?

1
Martin AJ

2つ目は1つ目と比較して間違いなく優れています。しかし、平均的なコンピュータユーザーにとって、ヘッダーを変更するよりもVPNを認識して身元を隠すプログラムが多いため、どのような種類のユーザーを扱っているかはわかりません。

私の意見では、平均的なユーザーにとっては、VPNプログラムをダウンロードする方が簡単なので、ヘッダーの方が信頼性が高いと思います。本当にIPを知る必要がある場合は、両方を保存する方が良いと思います。

また、ユーザーが自分のIDを隠すまで何をしているのかをユーザーが知っている場合、ヘッダーとリモートの両方を認証できないことに注意してください。

ユーザーを特定するためにユーザーについて収集できる情報は他にもたくさんありますが、私が言ったように、それはすべてユーザーが誰であり、その情報で何をしようとしているのかによって異なります。

考えるべきことがいくつかあります!

1
nd510