私はPHPでコードを書いており、クライアントのIPアドレスを検出したいと思います。 $ _SERVER ['REMOTE_ADDR']を使用しています。ブラウザはユーザーのIPアドレスを保護しますか?
これは通常動作します...しかし、時々私は定期的なインターネット接続にあったユーザーがウェブサイトに接続しようとしたときに127.255.255.255というアドレスを取得することがあります。それには理由がありますか?
私はPHPでコードを書いており、クライアントのIPアドレスを検出したいと思います。 $ _SERVER ['REMOTE_ADDR']を使用しています。ブラウザはユーザーのIPアドレスを保護しますか?
これは通常動作します...しかし、時々私は定期的なインターネット接続にあったユーザーがウェブサイトに接続しようとしたときに127.255.255.255というアドレスを取得することがあります。それには理由がありますか?
127.255.255.255
は、それが外部のユーザーのご確認の場合は、サイト上code injection可能性をチェックする必要がありますから、内部サーバー(ループバック)
放送です。
しかし、それはなぜいくつかのアドレスで動作するのでしょうか?それは奇妙だ。 – user1255714
'[P]'フラグを使って '.htaccess'ファイルにRewriteRulesがありますか?あなた自身がいくつかのページをプロキシするかもしれませんか? –
タイトルの質問に回答する: REMOTE_ADDRは、対応するWebサーバーによって設定され、ユーザーは(Proxiesなどを使用する以外は)変更できません。 HTTPが発生する前に、着信TCP接続から判断されます。
ただし、サーバーのネットワーク内の一部のファイアウォールまたはプロキシによって難読化されている可能性があります。
さらに、127.255.255.255はブロードキャストアドレスであり、HTTP接続(ユニキャストのみのTCP)の送信元であってはなりません。
問題はあなたが探している場所ではありません。実際に、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;
問題は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ビットだと思います)が負の数を返すことに注意してください注意してください。
あなたはどのWebサーバーを実行していますか? –
私は実際にはわかりません、私はwebhubhosting.comを使用しています。 – user1255714
プロキシなどを使用していて、クライアントのリモートアドレスとしてブロードキャストアドレス(127.255.255.255)を取得できる理由を確認する必要があります。別のユーザが言っているように、REMOTE_ADDR変数は、要求を受け取ったIPアドレスを使用してPHPスクリプトを実行するウェブサーバによって設定されます。 –