Я пишу код в 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;