Forum Webscript.Ru
Программирование => PHP => Тема начата: CGVictor от 10 Декабря 2004, 20:57:56
-
if (getenv("HTTP_CLIENT_IP")) $ip = getenv("HTTP_CLIENT_IP");
else if (getenv("HTTP_X_FORWARDED_FOR")) $ip = getenv ("HTTP_X_FORWARDED_FOR");
else if (getenv("REMOTE_ADDR")) $ip = getenv("REMOTE_ADDR");
else $ip = "UNKNOWN";
У меня вот такая конструкция вполне работает.
-
А у меня нет!
Выдает не мой ip а сервера.
-
Хотя на fatal.ru - все работает прекрасно, даже первый вариант!
Может дело в хостере?
-
if (getenv(\'HTTP_X_FORWARDED_FOR\')) {
$ip=getenv(\'HTTP_X_FORWARDED_FOR\');
}
else {
$ip=getenv(\'REMOTE_ADDR\');
}
-
Ну, это все равно вернет адрес хостера, а не мой.
Мой находится в HTTP_X_REAL_IP.
-
Vovan_Tverskoy
Глюк...
Хотя, если знаешь, где твой IP - получить не проблема, так? :)
-
оппа ребята, как так. дело не в серваке, это данные http заголовков, значит либо сервак работает через проксю (и от имени прокси соответственно идут заголовки) либо у тебя стоит типа прокси (или маскарадинг какой не такой) но маскируется под ip сервера......
попробуй на каком-нить бесплатном хостинге без прокси проверить (кроме h1..10..11 который Агава дает - там сервак как-раз через проксю работает)
или поставь себе Денвера и тестируй на нем, и траффик не жрешь и юзать удобно :-)
-
CGVictor , а ты вот прямо такой функцией и пользуешься? Часто?
-
как не имеющие никакого отношения к проблемам Толяна, все эти "советы" вынесены в отдельный топик.
-
RomikChef:
вынесены в отдельный топик
И почему-то опять с моим ником. Не нравится мне подобная популярность.
RomikChef:
ты вот прямо такой функцией и пользуешься?
[off]Будут бить по шапке...[/off]
Да, бывает.
-
бывает - это в каких случаях?
-
RomikChef
Ромик, ну не томи, давай сразу, где я опять напортачил...
RomikChef:
в каких случаях
Для определенности говорю "во всех".
[off]Повинную голову меч не сечет...[/off]
-
Эта функция наиболее реальными считает те адреса, которые легче всего подделать.
Собственно, к протоколу TCP/IP имеет отношение только переменная REMOTE_ADDR, поскольку содержит адрес хоста, который инициировал TCP/IP сессию.
Остальные же, такие, как HTTP_CLIENT_IP, HTTP_X_FORWARDED_FOR - это просто дополнительные текстовые поля в заголовке HTTP запроса.
Не надо, я думаю, объяснять, что НТТР заголовки легко подделываются.
Есть еще одна проблема.
Заключается она в том, что "реальный" IP адрес обычно весьма малоинформативен.
Большинство компьютеров сейчас подключено к интернету через локальные сети с IP адресами из приватных диапазонов - 10., 192., и так далее. Идентифицировать, даже приблизительно, откуда пришел такой запрос, невозможно в принципе.
Это, так сказать, фактическая сторона медали.
Но есть еще и, если можно так выразиться, философская.
Меня всегда удивляло, что в этой жизни люди всегда стремятся выбирать. Обязательно что-то одно. Или грудь в грестах, или голова в кустах. Ну, по законам военного времени такой максимализм понятен.
Но в мирное время - кто нас заставляет выбирать только один фактор?
Почему мы сами себе руки связываем?
Ограничиваем себя только одним параметром?
Или тот, или другой, или третий.
Тем более, в таком важном деле, как точная идентификация клинта.
Если так уж приспичило с аптекарской точностью определить адрес - Почему бы тогда не использовать сразу все? Это будет всяко надежнее, чем один.
Лично я, если бы озаботился таким вопросом, то писал бы ремоте аддр. а все остальные скидывал в поле произвольной формы. поскольку совсем не обязательно, что они будут иметь вид айпи адреса. для форвардед фор это даже в стандарте заложено - там они могут идти через запятую.
Но опять же - это только в случае, если действительно надо кого-то отслеживать. а в обычной жизни я пользуюсь ремоте аддр.
-
RomikChef:
а все остальные скидывал в поле произвольной формы
Так как тогда проверять? Если совпал хоть один адрес? Если все вместе, то один ... подделать можно.
[off]
RomikChef:
в обычной жизни я пользуюсь ремоте аддр
Хе.. и я, но исключительно от лени :)
Еще вот нашел на Скилле (http://skill.ru/artwork/1626.shtml) вариант, но у него те же недостатки:
$user_ip = implode (\', \', array_diff(preg_split ("/,\\s*/", (getenv(\'HTTP_X_FORWARDED_FOR\') ? getenv(\'HTTP_X_FORWARDED_FOR\').\', \' : \'\').(getenv(\'HTTP_CLIENT_IP\') ? getenv(\'HTTP_CLIENT_IP\') : getenv(\'REMOTE_ADDR\'))), array(\'unknown\')));
А слеши форум скушал.. Refer to original.[/off]