2012-03-11 8 views
3

私はPHPでコードを書いており、クライアントのIPアドレスを検出したいと思います。 $ _SERVER ['REMOTE_ADDR']を使用しています。ブラウザはユーザーのIPアドレスを保護しますか?

これは通常動作します...しかし、時々私は定期的なインターネット接続にあったユーザーがウェブサイトに接続しようとしたときに127.255.255.255というアドレスを取得することがあります。それには理由がありますか?

+0

あなたはどのWebサーバーを実行していますか? –

+0

私は実際にはわかりません、私はwebhubhosting.comを使用しています。 – user1255714

+1

プロキシなどを使用していて、クライアントのリモートアドレスとしてブロードキャストアドレス(127.255.255.255)を取得できる理由を確認する必要があります。別のユーザが言っているように、REMOTE_ADDR変数は、要求を受け取ったIPアドレスを使用してPHPスクリプトを実行するウェブサーバによって設定されます。 –

答えて

3

127.255.255.255は、それが外部のユーザーのご確認の場合は、サイト上code injection可能性をチェックする必要がありますから、内部サーバー(ループバック)

放送です。

+0

しかし、それはなぜいくつかのアドレスで動作するのでしょうか?それは奇妙だ。 – user1255714

+0

'[P]'フラグを使って '.htaccess'ファイルにRewriteRulesがありますか?あなた自身がいくつかのページをプロキシするかもしれませんか? –

0

タイトルの質問に回答する: REMOTE_ADDRは、対応するWebサーバーによって設定され、ユーザーは(Proxiesなどを使用する以外は)変更できません。 HTTPが発生する前に、着信TCP接続から判断されます。

ただし、サーバーのネットワーク内の一部のファイアウォールまたはプロキシによって難読化されている可能性があります。

さらに、127.255.255.255はブロードキャストアドレスであり、HTTP接続(ユニキャストのみのTCP)の送信元であってはなりません。

0

問題はあなたが探している場所ではありません。実際に、inet_atonを使用してmysqlに$_SERVER['REMOTE_ADDR']を格納するときは、その列がint (11) unsignedと定義されていることを確認する必要があります。

カラムが符号付きintの場合、データは切り捨てられ、127.255.255.255より大きいすべてのIPアドレスはそのまま保存されます。

あなたが(テーブルと列名を変更する)MySQLのテーブルの上にこのクエリを実行する必要があります。

ALTER TABLE `stats` CHANGE `ip` `ip` INT(11) UNSIGNED; 
1

問題はip2longが(255.255.255.255のため)4294967295ほどの多数を返すことで、 INT MySQLフィールド(署名されている場合)は最大値2147483647(ソース:http://dev.mysql.com/doc/refman/5.0/en/integer-types.html)を受け取り、2147483647より大きい値は2147483647として格納されます。このため、データベースには127.255.255.255がたくさんあります。

データベースの列をBIGINTまたはunsigned INTに変換すると問題は解決しますが、ip2long()のいくつかの実装(私は32ビット対64ビットだと思います)が負の数を返すことに注意してください注意してください。

関連する問題