Эта функция наиболее реальными считает те адреса, которые легче всего подделать.
Собственно, к протоколу TCP/IP имеет отношение только переменная REMOTE_ADDR, поскольку содержит адрес хоста, который инициировал TCP/IP сессию.
Остальные же, такие, как HTTP_CLIENT_IP, HTTP_X_FORWARDED_FOR - это просто дополнительные текстовые поля в заголовке HTTP запроса.
Не надо, я думаю, объяснять, что НТТР заголовки легко подделываются.
Есть еще одна проблема.
Заключается она в том, что "реальный" IP адрес обычно весьма малоинформативен.
Большинство компьютеров сейчас подключено к интернету через локальные сети с IP адресами из приватных диапазонов - 10., 192., и так далее. Идентифицировать, даже приблизительно, откуда пришел такой запрос, невозможно в принципе.
Это, так сказать, фактическая сторона медали.
Но есть еще и, если можно так выразиться, философская.
Меня всегда удивляло, что в этой жизни люди всегда стремятся выбирать. Обязательно что-то одно. Или грудь в грестах, или голова в кустах. Ну, по законам военного времени такой максимализм понятен.
Но в мирное время - кто нас заставляет выбирать только один фактор?
Почему мы сами себе руки связываем?
Ограничиваем себя только одним параметром?
Или тот, или другой, или третий.
Тем более, в таком важном деле, как точная идентификация клинта.
Если так уж приспичило с аптекарской точностью определить адрес - Почему бы тогда не использовать сразу все? Это будет всяко надежнее, чем один.
Лично я, если бы озаботился таким вопросом, то писал бы ремоте аддр. а все остальные скидывал в поле произвольной формы. поскольку совсем не обязательно, что они будут иметь вид айпи адреса. для форвардед фор это даже в стандарте заложено - там они могут идти через запятую.
Но опять же - это только в случае, если действительно надо кого-то отслеживать. а в обычной жизни я пользуюсь ремоте аддр.