| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > Скрипт не может определить IP |
| Автор: ReactOS 10.12.2007, 04:17 | ||||
| Привет! =) Вас беспокою по следующему поводу: Создал скрипт для определения IP. IP отловить не может, но кажется я догадываюсь почему! =) Мне просто интересно прав ли я или нет! Скрипт: "catch_ip.php"
Я цепляюсь за заголовок HTTP_X_FORWARD_FOR, но я юзаю хорошую прокси, которая не оставляет за собой заголовки, поэтому скрипт, если правильно сказать не "не работает", а просто не может определить IP. Вопросы: Как же взять IP? Ведь на сайте http://seemyip.com , любой ИП берется! Как мне брать хотя бы ИП прокси? PS: Скрипт, запрещающий доступ определенному IP, тоже не работает! =) Наверное, по этой же причине! =) НО: Знаю, что в .htaccess можно прописать:
Он же тоже не может отлавливать заголовки? =) А то сейчас возможности проверить - нет, подскажите насчет .htaccess тоже! Вроде чудес не бывает! =) |
| Автор: Leoo 10.12.2007, 09:56 |
| а функцию getIp не пробоваль юзать? |
| Автор: kasmanaft 10.12.2007, 10:16 |
| Leoo, штой-то за функция такая? ReactOS, используйте HTTP_X_FORWARDED_FOR |
| Автор: Leoo 10.12.2007, 15:11 |
| Прошу прощения, я немного ошибся |
| Автор: SelenIT 10.12.2007, 15:17 |
| Только HTTP_X_FORWARDED_FOR - далеко не единственное место, где могут скрываться (а могут и не скрываться) айпишники (см. напр. http://forum.vingrad.ru/forum/topic-20838/index.html). Если, как говорится, "очень надо" и совсем делать нечего, можно тупо перешерстить $_SERVER и $_ENV на предмет чего-либо хоть приблизительно айпиподобного |
| Автор: vasac 10.12.2007, 16:50 | ||
| getenv(HTTP_X_FORWARD_FOR) не забывайте строки заключать в кавычки.
Тот же REMOTE_ADDR |
| Автор: GZep 10.12.2007, 17:05 |
| аа.. г-н SelenIT уже дал ссылку на функцию, которая потрошит все заголовки подрят и выплевывает нечто, похожее на ip))) |
| Автор: Feldmarschall 11.12.2007, 10:59 |
| Мне кажется, сам подход у автора не совсем правильный. Во-первых, IP-адрес - это 4 байта, а не строка вида xxx.xxx.xxx.xxx/xxx.xxx.xxx.xxx Во-вторых, HTTP_X_FORWARDED_FOR - это никакая не "подсеть", что бы ни имелось в виду под этим термином, а HTTP заголовок. Ну, и небольшое замечание: в пхп отсутствует, насколько мне известно, константа HTTP_X_FORWARD_FOR. И никаких других констант с похожими именами - тоже. А строки в пхп пишутся в кавычках. |
| Автор: MoLeX 11.12.2007, 11:09 |
| Feldmarschall ну и какой подход по твоему правильный? З.Ы. ReactOS, у тебя REMOTE_ADDR в некоторых местах написан без земли (т.е. REMOTE ADDR) |
| Автор: Astraller 11.12.2007, 11:20 | ||
vasac,
Нет, он не пробьёт прокс, юзать надо HTTP_X_FORWARDED_FOR или HTTP_REAL_IP Feldmarschall, вполне они есть |
| Автор: Feldmarschall 11.12.2007, 11:22 | ||
| Мда, извинюсь. Мне показалось это очевидным. Скрипт: "catch_ip.php"
Про остальное написал г-н SelenIT. Разве что, я бы придрался к слоу "тупо", поскольку тупой перебор, как раз, испортит картину. Как минимум, надо отсекать приватные сети. Это если рассматривать проблему определения IP адреса, а не неправильного написания имени переменной, в которой, похоже, и кроется разгадка. И, в любом случае, как он совершенно правильно заметил, перебор HTTP заголовков не имеет с определением IP адреса ничего общего. Сам термин, кстати, "определение IP адреса", я уверен на 100%, толкуется участниками дискуссии по-разному. Мягко говоря. ReactOS, тебе обязательно надо включить отображение ошибок. Полное отображение. Уже второй вопрос ты задаешь из-за того, что не видишь сообщений об ошибках. |
| Автор: Feldmarschall 11.12.2007, 11:46 |
| Astraller, ну, вот это как раз то, о чем я говорил. Средний программист на PHP слабо разбирается в сетевых технологиях. Повторю ещё раз. HTTP_X_FORWARDED_FOR или HTTP_REAL_IP - это НТТР заголовки. Учитывая, что в НТТР заголовке может быть написано "админ - дурак!", ты будешь продолжать настаивать на том, что надо использовать именно эти переменные? Кстати, о переменных. Я, конено, не уверен, и проверять мне лень, но я ни разу в жизни не видел, чтобы где-то использовались константы типа HTTP_X_FORWARDED_FOR. Судя по беглому знакомству с этим разделом форума, его посетители пренебрегают уровнем отображения ошибок E_ALL, отчего и происходят такие заблуждения и многочисленные ошибки. Вопрос же "определения IP адреса" - скорее философский. Надо четко понимать - что ты хочешь определить. Иначе можно разочароваться. |
| Автор: Astraller 11.12.2007, 14:14 | ||||||
Уважаемый Feldmarschall,
Если есть выбор в 1 из 1kk случаев наткнуться на идиота который передаёт не верные значения header и отсеять его с помощью простого регулярного выажения и слепо доверять REMOTE_ADDR, я выберу первое!
Это говорит лишь о скудности вашего опыта и подтверждает лень. Не более более, ни менее.
"Что" ты хочешь определить ясно всем и каждому, вопрос "зачем" тебе его IP как раз и различает уровни. |
| Автор: vasac 11.12.2007, 15:51 | ||
Feldmarschall, HTTP_X_FORWARDED_FOR встречается повсеместно, плохо искали. И везде совершенно четко говорится — единственное в чем можно быть б/м уверенным, это REMOTE_ADDR — IP пользователя или последнего прокси в цепи. Всё остальное заголовки, которые можно использовать для статистики и т.п, но не для построения на их основе какой-то системы безопастности.
Не понял |
| Автор: Anarki 11.12.2007, 17:07 |
| ReactOS, Можно сделать так. Ограничить заход юзеров с прокси, используя блокировки DNSBL, тогда есть вероятность, что тот пользователь которому хотите перекрыть доступ сидит за открытой проксей и не сможет получить доступ к ресурсу |
| Автор: SelenIT 11.12.2007, 17:45 | ||
Feldmarschall,
Сорри, можно про это чуть подробнее? |
| Автор: Feldmarschall 11.12.2007, 18:54 |
| SelenIT, ну, я имею в виду, что если попадется айпишник из приватной сети, типа 192., то его не брать. Хотя сейчас подумал - то почему нет? Мы же не замену REMOTE_ADDR ищем. Идея, кстати, хорошая - перебирать весь массив поиском по маске. Мне не приходила в голову. |
| Автор: GZep 12.12.2007, 17:40 |
| Feldmarschall, юзай тот вариант, что дали и не парься, поверь, на него я довольно много времени убил. |
| Автор: Feldmarschall 12.12.2007, 18:17 |
| Давайте определимся с терминологией. Юзать для чего? Вместо REMOTE_ADDR? Для определения "IP адреса"? IP адресов много, а мне никто так и не ответил, что имеется виду под этим термином. |
| Автор: Astraller 13.12.2007, 15:37 | ||||
vasac,
Я имел в виду что если пользователь пришел через прокс то REMOTE_ADDR вернёт IP прокси вместо IP машины пользователя. Добавлено через 10 минут и 18 секунд
IP-адрес (aй-пи адрес, сокращение от англ. Internet Protocol Address) — уникальный идентификатор (адрес) устройства (обычно компьютера), подключённого к локальной сети или интернету. |
| Автор: GZep 13.12.2007, 16:05 |
| Feldmarschall, тот код, ссылку на который мы давали - пытается найти "истинный" ip если человек юзает прокси (не анонимный), не более. Если интересно, почитай обсуждение и историю создания того примера. |
| Автор: Feldmarschall 13.12.2007, 16:27 |
| Я читал. Ничего общего с истиной тот код не имеет. Нет, неинтересно. Я читал таких обсуждений миллион. Все они сводятся к обсуждению того, что "истиннее" - X_FORWARDED_FOR или REAL_IP. В общем, чтобы подытожить тему: ReactOS, если тебе нужен IP адрес, то это REMOTE_ADDR. К примеру, в логах у тебя есть поле IP - пишешь туда именно его. Точка. Если ты хочешь получать справочную информацию о, возможно, имеющихся в HTTP заголовках строках, визуально похожих на IP адреса, то делаешь то, что сказал Selenit - в цикле по массиву $_SERVER, ищем заголовки содержащие подстроку подходящую под нужный шаблон. При этом сохраняем их во-первых - с именем заголовка, а во-вторых, разумеется - в строковом виде. Вообще, все зависит от того, какую цель ты преследуешь. Если получить максимум информации о клиенте, то стоит хранить вообще все заголовки - сериализовать массив $_SERVER и сохранять целиком. Но, в любом случае, к получению IP адреса это уже не имеет отношения. IP адрес бывает только один - REMOTE_ADDR. Если ты записываешь хоть что-то вместо него - это глупость и непонимание элементарных вещей. Примечание: В случае, когда сервер провайдера настроен криво, и REMOTE_ADDR не определен или выдает один и тот же адрес для всех посетителей, следует обратиться в техподдержку провайдера с вопросом - в какой переменной содержится IP адрес, и использовать её. Убедившись сначала, что там лежит именно IP адрес, а не строка непонятного формата. Но лучшим решением будет уйти от такого провайдера к нормальному. |
| Автор: Astraller 14.12.2007, 12:48 | ||
Feldmarschall,
|
| Автор: Feldmarschall 14.12.2007, 13:03 |
| Я повторю свой вопрос. На который многочисленные "специалисты", решившие меня поучить, так и не могут дать ответа. Видимо, не хватает практических знаний. Что ж. Придется объяснять на пальцах. Итак, возьмем самый обычный вариант: Есть пользовательский компьютер, который, который находится в офисной сети. IP компьютера 192.168.0.22 Офисная сеть включена через роутер в сеть здания. IP роутера - 10.10.0.3 Сеть здания, в свою очередь, подключена к интернету, через роутер. IP роутера - 77.88.22.11 Пользователь заходит на сайт, пользуясь открытым прокси. IP прокси - 111.222.000.8 Мы можем получить в скрипте любой из этих адресов. Вопросы: 1. Какой из IP считается "истинным"? 2. Мы ведем логи. В лог записывается только 1 IP адрес. Какой из адресов следует записать в лог? Примечание: Следует правильно понимать смысл этих вопросов. Это не проверка знаний. Это уточнение терминов. Я всё хочу понять - что понимают местные знатоки под словами "истинный IP адрес" и хочу перевести вопрос об определении адреса из теоретической в практическую плоскость (Вопрос N2). |
| Автор: Astraller 14.12.2007, 13:08 |
| Feldmarschall, что ж, придётся спустится до уровня "детского сада". Я жду вашего ответа, и не намерен отвечать на ваши вопросы, пока не получу ответа на свой. |
| Автор: vasac 14.12.2007, 13:12 |
| Feldmarschall, вы тут уже неделю пишите какую-то чушь, выжимая из соврешенно пустой темы непонятно что и сыпя банальностями, которые и так всем понятны, но при этом изображая себя учителем недоумков. |
| Автор: AlienStorm 14.12.2007, 13:17 | ||||||
Последний. "И точка." © Feldmarschall
ВЫ можете записать туда что угодно. Но хостинг в лог запишет только последний. Потому что прокси это или прямой запрос - значения не имеет. Может быть прямой НТТР запрос был модифицирован с целью дезинформации?
Я не местный, поэтому скажу как это понимаю я. Это IP с которого был сделан запрос, пришедший на сервер. Практическая плоскость же зависит от самого хостинга, а не каких то надуманых условий. Где-то этот самый айпишник хранится в REMOTE_ADDR, а где-то - в HTTP_X_FORVARDED_FOR. Узнать просто - сдалть самому запрос или просто спросить у техподдержки. |
| Автор: Feldmarschall 14.12.2007, 13:21 |
| Слово "истинный" не имеет технического смысла. Я отвечу, как только мне предоставят определение этой "истинности". Я даже привел пример, на котором можно просто пальцем ткнуть в один из IP адресов. И я тут же отвечу. Так трудно сделать простой выбор из 4 пунктов? |
| Автор: Astraller 14.12.2007, 13:22 | ||
AlienStorm,
Я бы сказал не только от хостинга но и поставленной задачи, если нужен "абсолютно правильный лог" то хранить оба адреса: REMOTE_ADDR и HTTP_X_FORVARDED_FOR, и это будет наиболее точной организацией в случае привязки к IP - ИМХО. Я вам предоставил выбор из двух вариантов. Где же ваш ответ?! |
| Автор: Feldmarschall 14.12.2007, 13:26 |
| AlienStorm, спасибо за единственный грамотный ответ во всей теме. Единственная поправочка - всё-таки, вероятность того, что IP пира будет лежать в переменнй HTTP_X_FORVARDED_FOR, стремится к нулю. Я, вообще-то, не работал с хостингами, где апач сидит в тюрьме. Но там, обычно, насколько мне известно, называют как-то по-другому. Не говоря уже о том, что эти случаи являются экстраординарными, и требуют специального ручного подхода каждый раз. Если учитывать их наряду с другими на автомате, то это приведет к катастрофическим последствиям. То есть, верить HTTP_X_FORVARDED_FOR мы можем только в том случае, если её установил наш собственный сервер. Добавлено через 5 минут и 43 секунды Понятно. Astraller, провалил тест. Кто следующий? Подходите, не бойтесь. Стыдно не незнание, стыдно нежелание узнать ;-) |
| Автор: AlienStorm 14.12.2007, 13:33 | ||
Я на таком хостинге и работаю. Из всей специфики - айпишник лежит в HTTP_X_FORVARDED_FOR. Все остальные поля содержат наши внутренние адреса. Собственно можно было бы и их оттранслировать, но зачем? Есть наш форум, где это все описано. Работает техподдержка... Зачем вводить новые модули в серв? |
| Автор: Feldmarschall 14.12.2007, 13:36 |
| Фиговая практика. Вы заставляете людей переделывать вообще все скрипты. Неужели тружно переписать переменную окружения REMOTE_ADDR? |
| Автор: AlienStorm 14.12.2007, 13:41 |
| Замена одной переменной - это все скрипты? Просто особенность, не более. Все CMS про нее знают... |
| Автор: Feldmarschall 14.12.2007, 13:49 |
| AlienStorm, неужели я непонятно написал? В меня уже начинает закрадываться подозрение в том, то ты работаешь провайдером и понимаешь, что такое HTTP_X_FORVARDED_FOR. В подавляющем большинстве случаев ценность этой переменной для определения IP адреса сравнима с ценностью использованной мягкой бумажки. Поэтому "Все CMS", работающие на нормальных хостингах, наоборот - должны её не знать!. |
| Автор: MoLeX 14.12.2007, 13:56 |
| это еще почему объясни популярным языком, можно и без научной теминология... я переживу и постораюсь понять |
| Автор: AlienStorm 14.12.2007, 14:06 | ||
Я не согласен. Потому что эта переменная - список перенаправлений пакета. Так вот, когда она попала к Апачу (через прокс, обращаю внимание, в моем случае) - то весь список перенаправлений мы получаем в одной переменной, а не целой куче! Такой вот обычный, линейный список. Те, кто об этом не знаю - будут страдать первое время, но на самом деле это очень удобно. Левой инфы там не будет - 100%, потому что даже если это поле будет содержать пустую строку, то в нее минимум пойдет адрес, с которого пришел запрос. *** Да, и еще. Если CMS про нее знать не будут - то можем получить ситуацию, что забанив по IP массовый прокси - баним всех. А это нехорошо. Достаточно просмотреть HTTP_X_FORWARDED_FOR на предмет искомого IP. Конечно, часть людей и на этом могут попасть, но не в таких промышленных масштабах. |
| Автор: Feldmarschall 14.12.2007, 14:18 |
| AlienStorm, я говорю не о том, что эта переменная содержит на вашем хостинге. Я говорю о том, что она содержит на нормальных хостингах. CMS не может знать, на каком хостинге она расположена. И не может автоматически выбрать, откуда ей брать айпишник - из REMOTE_ADDR или из HTTP_X_FORWARDED_FOR По-моему, ты всю эту историю просто выдумал. Давай ссылку на форум, где все описано. |
| Автор: AlienStorm 14.12.2007, 14:25 |
| Вуаля. http://www.ayola.net/forum (на правах раскрутки своего родимого хостинга) Нормальных хостингов не бывает. У каждого свои заглюки. Только наш еще и бесплатный, поэтому можем себе позволить такое. |
| Автор: Astraller 14.12.2007, 14:28 | ||
Feldmarschall, вот скажите разработчики IBR ламеры или кто, но в IPB есть функция "Брать IP из HTTP_X_FORWARDED_FOR". Может истолкуете сей факт?!
А вы не хотите ответить на мои вопросы? И кто вы такой чтобы меня тестировать? Я к вам на работу не устраиваюсь. |
| Автор: AlienStorm 14.12.2007, 14:29 | ||
Если вебмастер не оптимизирует CMS под хост - он ленивый или кривой вебмастер. Если он не знает как это исправить - то RTFM. |