web-dev-qa-db-ja.com

$ _SERVER ['REMOTE_ADDR']は正しいIPアドレスを与えません

PHPでフォームを作成しています。ユーザーのIPアドレスの記録を保持したいと考えています。これは私が使用したコードの抜粋です:

<input type="hidden" name="ip" value="<?php echo $_SERVER['REMOTE_ADDR']; ?>" />

XAMPPでコードを開いてソースを読み取ると、値には私のものとは異なるIPアドレスがありました。

<input type="hidden" name="ip" value="::1" />

ローカルホスト(XAMPP)で使用すると、このIPアドレスは通常発生しますか?
そうでない場合、ユーザーのIPアドレスを取得する代替手段はありますか?

12
zeldarulez

_<input type="hidden" name="ip" value="<?php echo $_SERVER['REMOTE_ADDR']; ?>" />_

それをしないでください。フォームが送信されたときに_$_SERVER_からリクエストを取得します。フォームが生成されたときにそれを取得し、フォームに格納することは、人々にそれを変更する機会を与えるだけです。

Does this IP address normally happen when I use it in a localhost (XAMPP)?

はい。ローカルホストからページをリクエストする場合、ローカルIP(IPv6)アドレスの取得は正常です。

18
Quentin

IP ::1はIPv6バージョンでは「localhost」です。マシンはIPv6で構成されているため、このIPアドレスを取得しています。おそらく、アプリケーションをライブサーバーにデプロイすると、IPv6はサーバー上で構成されず、アプリはより馴染みのあるIPv4アドレス(例:aaa.bbb.ccc.ddd)を取得します。

別のメモでは、$_SERVER['REMOTE_ADDR']には常に正しいアドレスが含まれているとは限りません。使用することをお勧めします:

if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip_address = $_SERVER['REMOTE_ADDR'];
}
25
Aleks G

1)。フォームに<?php echo $_SERVER['REMOTE_ADDR']; ?>を追加する必要はありません。この場合、それを偽造するのは簡単です(実際には、どんな場合でも簡単です)。サーバー側のデータにIPを追加することをお勧めします。

2)$_SERVER['HTTP_X_FORWARDED_FOR']も参照できます。ユーザーがプロキシを持っている場合、それらのいくつか(透過プロキシ)は実際のユーザーのIPをそこに配置します。

3)ただ注意してください:IPに関するデータはまったく信頼できません。

4
Nayjest

':: 1'はIPV6バージョンのlocalhost(または127.0.0.1)です。

ポート80を開き、IPアドレスからページにアクセスします。その後、正常に動作するはずです:)。

4
Prash

これは実際にはあなたのIPです。ただし、IPv4ではなくIPv6 IPです。

IPv6では、:: 1はlocalhost/127.0.0.1を表します。

1
Khôi
if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARTDED_FOR'] != '') {
                $ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
            } else {
                $ip_address = $_SERVER['REMOTE_ADDR'];
            }   

このコードはクライアントのIPを返します。これがサーバーIPであると思われる場合は、サーバーが(おそらく)PCでホストされているため、おそらく正しいでしょう。クライアント(PC)とサーバーは同じPC上で実行されるため、どちらも同じIPを持っています。これを理解していない場合は、IP、ローカルIP、およびその他すべてについて実際に調査する必要があります。

0
Max