браузеры защищают IP-адрес пользователей?

Я пишу код в PHP, и я хотел бы определить IP-адрес клиента. Я использую $ _SERVER ['REMOTE_ADDR'].

Он работает обычно … Но иногда я получаю адрес 127.255.255.255, когда пользователь, который был в обычном интернет-соединении, пытался подключить веб-сайт. Есть ли причина для этого?

127.255.255.255 – это широковещательная передача с вашего внутреннего сервера (loopback)

Если вы уверены, что это внешний пользователь, вы должны проверить возможности инъекции кода на своем сайте.

Проблема в том, что ip2long вернет число, равное 4294967295 (для 255.255.255.255), и что ваше поле INT MySQL (если оно подписано) принимает максимальное значение 2147483647 (источник: http://dev.mysql.com/doc /refman/5.0/en/integer-types.html ), и поэтому любое значение выше 2147483647 будет сохранено как 2147483647. Вот почему у вас в вашей базе данных 127.255.255.255.

Я предполагаю, что преобразование столбца базы данных в BIGINT или unsigned INT исправит это, но имейте в виду, что некоторые реализации (я думаю, что это 32-разрядные или 64-разрядные) ip2long () вернут отрицательное число, чтобы быть осторожным.

Чтобы ответить на вопрос в заголовке: REMOTE_ADDR устанавливается соответствующим веб-сервером и не может быть изменен пользователем (за исключением использования прокси и т. Д.). Он определяется исходящим TCP-соединением до HTTP.

Однако это может быть запущено некоторыми брандмауэрами или прокси-серверами в сети сервера.

Кроме того, запутанным является то, что 127.255.255.255 является широковещательным адресом и не должен быть источником для HTTP-соединения (это TCP, который является только одноадресной).

Проблема не в том, где вы ищете. Фактически, когда вы храните $_SERVER['REMOTE_ADDR'] в mysql, используя inet_aton , вы должны убедиться, что столбец определен как int (11) unsigned .

Если ваш столбец является подписанным int , данные усекаются, и все IP-адреса, размер которых превышает 127.255.255.255, сохраняются как таковые.

Вам нужно запустить этот запрос в своей таблице mysql (изменить имя таблицы и столбца):

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