Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Как 100% определить IP посетителя?


Автор: mike_prog 3.4.2004, 18:17
Как можно определить IP адрес посетителя. Знаю: PROXY, всякий там бред. Но теоретически же можно определить адрес как-то. Если даже прокся генерирует каждый раз новый адрес, то можно хотя-бы узнать адрес этого сеанса?

Автор: mike_prog 3.4.2004, 18:28
А как это сделать, на 79,3%?

Автор: Secandr 3.4.2004, 18:44
на 100% опредилить нельзя, вообще ничего 100% не бывает!

Автор: Mal Hack 3.4.2004, 19:49
Код
function get_ip()
{
  if ($ip = getenv("HTTP_CLIENT_IP")) return $ip;

  if ($ip = getenv("HTTP_X_FORWARDED_FOR"))
  {
     if ($ip == '' || $ip == "unknown")
     {
         $ip = getenv("REMOTE_ADDR");
     }
     return $ip;
  }

  if ($ip = getenv("REMOTE_ADDR")) return $ip;
}

А вот тут детально описавается что и как: http://phpclub.ru/talk/showthread.php?threadid=42766
Правда, все-таки вариант того, что это обойдкт - есть, но он очень мал.

Автор: Master 3.4.2004, 22:06
анонимный прокси обойдет все.
если кому-то надо не замеченым пройти на сайт, то он пройдет... если конечно не перебанить все анонимные прокси сервера )

Автор: pascal 4.4.2004, 00:16
Цитата
если конечно не перебанить все анонимные прокси сервера

Некоторые анонимные прокси косят под обычного клиента, как их ты банить предлагаешь?
А как насчёт каскадных прокси? я например в фирме через каскадный прокси по HTTP лазил, причём сервер не мог определить даже адрес моего ближайшего прокси... Иногда ещё похлеще приходиться извращаться чтобы за трафик не платить...

Автор: -=::BlackCat::=- 4.4.2004, 03:19
http://forum.carderplanet.com/viewtopic.php?t=26014&sid=b06b982b4280533a7f8b7230eeeffeeb

http://forum.carderplanet.com/viewtopic.php?t=8509&sid=b06b982b4280533a7f8b7230eeeffeeb

и как ты хочешь всё это забаннить?

Автор: arial 14.11.2004, 22:35
Код
function get_ip()
{
   if (!empty($_SERVER) && isset($_SERVER['REMOTE_ADDR'])) {
       $remote_addr = $_SERVER['REMOTE_ADDR'];
   } elseif (!empty($_ENV) && isset($_ENV['REMOTE_ADDR'])) {
       $remote_addr = $_ENV['REMOTE_ADDR'];
   } elseif (@getenv('REMOTE_ADDR')) {
       $remote_addr = getenv('REMOTE_ADDR');
   }

   if (!empty($_SERVER) && isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
       $http_x_forwarded_for = $_SERVER['HTTP_X_FORWARDED_FOR'];
   } elseif (!empty($_ENV) && isset($_ENV['HTTP_X_FORWARDED_FOR'])) {
       $http_x_forwarded_for = $_ENV['HTTP_X_FORWARDED_FOR'];
   } elseif (@getenv('HTTP_X_FORWARDED_FOR')) {
       $http_x_forwarded_for = getenv('HTTP_X_FORWARDED_FOR');
   }

   if (!empty($_SERVER) && isset($_SERVER['HTTP_X_FORWARDED'])) {
       $http_x_forwarded = $_SERVER['HTTP_X_FORWARDED'];
   } elseif (!empty($_ENV) && isset($_ENV['HTTP_X_FORWARDED'])) {
       $http_x_forwarded = $_ENV['HTTP_X_FORWARDED'];
   } elseif (@getenv('HTTP_X_FORWARDED')) {
       $http_x_forwarded = getenv('HTTP_X_FORWARDED');
   }

   if (!empty($_SERVER) && isset($_SERVER['HTTP_FORWARDED_FOR'])) {
       $http_forwarded_for = $_SERVER['HTTP_FORWARDED_FOR'];
   } elseif (!empty($_ENV) && isset($_ENV['HTTP_FORWARDED_FOR'])) {
       $http_forwarded_for = $_ENV['HTTP_FORWARDED_FOR'];
   } elseif (@getenv('HTTP_FORWARDED_FOR')) {
       $http_forwarded_for = getenv('HTTP_FORWARDED_FOR');
   }

   if (!empty($_SERVER) && isset($_SERVER['HTTP_FORWARDED'])) {
       $http_forwarded = $_SERVER['HTTP_FORWARDED'];
   } elseif (!empty($_ENV) && isset($_ENV['HTTP_FORWARDED'])) {
       $http_forwarded = $_ENV['HTTP_FORWARDED'];
   } elseif (@getenv('HTTP_FORWARDED')) {
       $http_forwarded = getenv('HTTP_FORWARDED');
   }

   if (!empty($_SERVER) && isset($_SERVER['HTTP_VIA'])) {
       $http_via = $_SERVER['HTTP_VIA'];
   } elseif (!empty($_ENV) && isset($_ENV['HTTP_VIA'])) {
       $http_via = $_ENV['HTTP_VIA'];
   } elseif (@getenv('HTTP_VIA')) {
       $http_via = getenv('HTTP_VIA');
   }

   if (!empty($_SERVER) && isset($_SERVER['HTTP_X_COMING_FROM'])) {
       $http_x_coming_from = $_SERVER['HTTP_X_COMING_FROM'];
   } elseif (!empty($_ENV) && isset($_ENV['HTTP_X_COMING_FROM'])) {
       $http_x_coming_from = $_ENV['HTTP_X_COMING_FROM'];
   } elseif (@getenv('HTTP_X_COMING_FROM')) {
       $http_x_coming_from = getenv('HTTP_X_COMING_FROM');
   }

   if (!empty($_SERVER) && isset($_SERVER['HTTP_COMING_FROM'])) {
       $http_coming_from = $_SERVER['HTTP_COMING_FROM'];
   } elseif (!empty($_ENV) && isset($_ENV['HTTP_COMING_FROM'])) {
       $http_coming_from = $_ENV['HTTP_COMING_FROM'];
   } elseif (@getenv('HTTP_COMING_FROM')) {
       $http_coming_from = getenv('HTTP_COMING_FROM');
   }

   if (!empty($remote_addr)) {
       $direct_ip = $remote_addr;
   }

   $proxy_ip     = '';
   if (!empty($http_x_forwarded_for)) {
       $proxy_ip = $http_x_forwarded_for;
   } elseif (!empty($http_x_forwarded)) {
       $proxy_ip = $http_x_forwarded;
   } elseif (!empty($http_forwarded_for)) {
       $proxy_ip = $http_forwarded_for;
   } elseif (!empty($http_forwarded)) {
       $proxy_ip = $http_forwarded;
   } elseif (!empty($http_via)) {
       $proxy_ip = $http_via;
   } elseif (!empty($http_x_coming_from)) {
       $proxy_ip = $http_x_coming_from;
   } elseif (!empty($http_coming_from)) {
       $proxy_ip = $http_coming_from;
   }

   if (empty($proxy_ip)) {
       // True IP without proxy
       return $direct_ip;
   } else {
       $is_ip = preg_match('|^([0-9]{1,3}\.){3,3}[0-9]{1,3}|', $proxy_ip, $regs);
       if ($is_ip && (count($regs) > 0)) {
           return $regs[0];
       } else {
           return 0;
       }
   }
}
Спёр из phpmyadmin.

Автор: IZ@TOP 15.11.2004, 09:41
arial, мощьные навароты... только толку?

Автор: arial 15.11.2004, 17:51
Цитата(IZ @ 15.11.2004, 10:41)
arial, мощьные навароты... только толку?

Навороты позволяют поднять процент определения реального IP с 34,5% до 79,3%. ;)

Автор: IZ@TOP 15.11.2004, 17:52
arial, откуда цифры?

Автор: arial 16.11.2004, 17:49
От балды.

Автор: Goganchic 30.4.2007, 09:34
Цитата(IZ@TOP @  15.11.2004,  17:52 Найти цитируемый пост)
arial, откуда цифры? 


Цитата(arial @  16.11.2004,  17:49 Найти цитируемый пост)
От балды.

Офигенная статистика smile

Автор: GZep 30.4.2007, 09:40
хороший скрипт, только размер просто очень большой... можно уменьшить его, оптимизировав, в разы...

Автор: GZep 30.4.2007, 10:05
вот, сделал!
Код

function IPDetect() {
        $serverVars = array(
            "HTTP_X_FORWARDED_FOR",
            "HTTP_X_FORWARDED",
            "HTTP_FORWARDED_FOR",
            "HTTP_FORWARDED",
            "HTTP_VIA",
            "HTTP_X_COMING_FROM",
            "HTTP_COMING_FROM",
            "HTTP_CLIENT_IP"
        );
        foreach ($serverVars as $serverVar)
            if (!empty($_SERVER[$serverVar]))
                $proxyIP = $_SERVER[$serverVar];
        if (!empty($proxyIP)) {
            $isIP = preg_match('|^([0-9]{1,3}\.){3,3}[0-9]{1,3}|', $proxyIP, $regs);
            if ($isIP && (sizeof($regs) > 0))
                return $regs[0];
        }
        return $_SERVER['REMOTE_ADDR'];
}

в функцию добавил:
  • теперь и "HTTP_CLIENT_IP" проверяется...
  • размер стал гораздо меньше...
  • теперь функция не возвращает "0", если проксик анонимный...

Автор: woin 30.4.2007, 11:08
Цитата(GZep @  30.4.2007,  10:05 Найти цитируемый пост)
вот, сделал!

А как к этому теперь обращаться?
 
Код

$user_ip=IPDetect();

 

Автор: GZep 30.4.2007, 11:26
ну, да... smile 

Автор: SelenIT 30.4.2007, 13:17
GZep, если я ничего не путаю, в HTTP_X_FORWARDED_FOR реальный IP обычно бывает последним, а Ваш код отловит первый... или я всё же заблуждаюсь?

Автор: GZep 30.4.2007, 14:42
SelenIT, в этом примере все делается в том же порядке, что и в содранном из phpmyadmin примере arial'a. Только вместо используется цикл, делающий код изящьнее и более легким к изменениям...

Автор: SelenIT 30.4.2007, 15:13
GZep, сорри, не приметил preg_match'а в конце примера arialа (лень было код развернуть). Да, функционально оба примера почти эквивалентны (а если добавить в Ваш изящный цикл ещё и поиск в $_ENV - будут вообще эквивалентны). Но правильно ли они работают - вопрос по-прежнему открытый;)...

Автор: GZep 30.4.2007, 15:59
Все правильно... только вот зачем $_ENV?

Могу добавить функцию проверки Ip адресса, чтобы прокси сервер уже не смог бы передать что-то вроде такого: 999.999.999.999. Сейчас он может такое передать...

Автор: SelenIT 30.4.2007, 16:25
Цитата(GZep @  30.4.2007,  15:59 Найти цитируемый пост)
функцию проверки Ip адресса

Имхо, лишнее. Степень доверия к данному адресу от этого вряд ли сильно вырастет smile.

Цитата(GZep @  30.4.2007,  15:59 Найти цитируемый пост)
зачем $_ENV?

Не всегда эти вещи в серверных переменных оказываются. С IIS-ом, по-моему, бывают с этим проблемы. Да и вообще среди хостеров иногда попадаются ба-альшие оригиналы;)...

Автор: GZep 30.4.2007, 16:42
Цитата(SelenIT @  30.4.2007,  16:25 Найти цитируемый пост)
Имхо, лишнее

афтор просил 100%! smile 
Цитата(SelenIT @  30.4.2007,  16:25 Найти цитируемый пост)
Не всегда эти вещи в серверных переменных оказываются

ну, тогда добавлю...

вот новый код:
Код

function IPDetect() {
        $serverVars = array(
            "HTTP_X_FORWARDED_FOR",
            "HTTP_X_FORWARDED",
            "HTTP_FORWARDED_FOR",
            "HTTP_FORWARDED",
            "HTTP_VIA",
            "HTTP_X_COMING_FROM",
            "HTTP_COMING_FROM",
            "HTTP_CLIENT_IP"
        );
        foreach ($serverVars as $serverVar) {
            if (!empty($_SERVER) && !empty($_SERVER[$serverVar]))
                $proxyIP = $_SERVER[$serverVar];
            elseif (!empty($_ENV) && isset($_ENV[$serverVar]]))
                $proxyIP = $_ENV[$serverVar]];
            elseif (@getenv($serverVar]))
                $proxyIP = getenv($serverVar]);
        }
        if (!empty($proxyIP)) {
            $isIP = preg_match('|^([0-9]{1,3}\.){3,3}[0-9]{1,3}|', $proxyIP, $regs);
            if ($isIP && (sizeof($regs) > 0) ?? isIP($regs[0]))
                return $regs[0];
        }
        return $_SERVER['REMOTE_ADDR'];
}
function isIP($ip) {//нас не обмануть!!!!
        $tmp = explode('.', $ip);
        if (count($tmp) != 4)
            return false;
        for ($i = 0; $i < 4; $i++)
            if (!preg_match("/^[0-9]+$/", $tmp[$i]) || $tmp[$i] < 0 || $tmp[$i] > 255)
                    return false;
        return true;
}

Вот самый идеальный на сегодняшний день скрипт!

Автор: SelenIT 30.4.2007, 17:01
Я бы, на мой характер, переписал ф-цию isIP в виде function isIP($ip) { return ip2long($ip) != -1; }. Хотя, для единообразия можно просто заменить [0-9]{1,3} на что-нибудь вроде (?:[01]?\d{1,2}|2[0-4]\d|25[0-5]) и вообще обойтись без неё... smile

Автор: woin 30.4.2007, 20:09
Цитата(GZep @  30.4.2007,  16:42 Найти цитируемый пост)
Вот самый идеальный на сегодняшний день скрипт! 

 В нём кажется много лишних квадратных скобочек  smile 

Автор: Anarki 30.4.2007, 21:04
Добавлю еще парочку заголовков
HTTP_XROXY_CONNECTION
HTTP_PROXY_CONNECTION
HTTP_USERAGENT_VIA

А вообще, зайдет человек через SOCKS сервер и не определите вы его IP настоящий.

Автор: GZep 1.5.2007, 13:06
Код

function IPDetect() {
        $serverVars = array(
            "HTTP_X_FORWARDED_FOR",
            "HTTP_X_FORWARDED",
            "HTTP_FORWARDED_FOR",
            "HTTP_FORWARDED",
            "HTTP_VIA",
            "HTTP_X_COMING_FROM",
            "HTTP_COMING_FROM",
            "HTTP_CLIENT_IP",
            "HTTP_XROXY_CONNECTION",
            "HTTP_PROXY_CONNECTION",
            "HTTP_USERAGENT_VIA"
        );
        foreach ($serverVars as $serverVar) {
            if (!empty($_SERVER) && !empty($_SERVER[$serverVar]))
                $proxyIP = $_SERVER[$serverVar];
            elseif (!empty($_ENV) && isset($_ENV[$serverVar]]))
                $proxyIP = $_ENV[$serverVar]];
            elseif (@getenv($serverVar]))
                $proxyIP = getenv($serverVar]);
        }
        if (!empty($proxyIP)) {
            $isIP = preg_match('|^([0-9]{1,3}\.){3,3}[0-9]{1,3}|', $proxyIP, $regs);
            $long = ip2long($regs[0]);
            if ($isIP && (sizeof($regs) > 0) && $long != -1 && $long !== false)
                return $regs[0];
        }
        return $_SERVER['REMOTE_ADDR'];
}

Anarki, хорошо, новые заголовки я добавил, но хорошо бы увидеть откуда вы их взяли...
Цитата(SelenIT @  30.4.2007,  17:01 Найти цитируемый пост)
ip2long($ip) != -1

Ok. Только ip2long($ip) != -1 && ip2long($ip) !== false.

Автор: Kallisto 1.5.2007, 14:05
Модератор: Сообщение скрыто.

Автор: GZep 1.5.2007, 14:42
Цитата(Kallisto @  1.5.2007,  14:05 Найти цитируемый пост)
Вы какой-то бред говорите.

Не хамите! smile 
Цитата(Kallisto @  1.5.2007,  14:05 Найти цитируемый пост)
способа защиты: 

мы тут защиту не делаем!

Мы просто вычесляем ip средствами php

Цитата(Kallisto @  1.5.2007,  14:05 Найти цитируемый пост)
Но запомните: если надо пройти - пройдут.

Если бы вы прочитали тему то увидели бы что это уже писАли. smile 

Автор: Gold Dragon 2.5.2007, 07:27
GZep, а можешь прокомментировать строки своей функции

Автор: Sai 27.5.2007, 02:23
Цитата(Kallisto @ 1.5.2007,  14:05)
Вы какой-то бред говорите.
Если поставить прокси полностью анонимный, то запрос будет идти так: ВЫ->прокси->прокси сам! выкачивает страницу и отдает вам.. То есть всякие ваши REMOTE_ADDR И прочее все в задницу..

я знаю 2 более-менее нормальных способа защиты: 
1. Поставить на сайт ява-апплет, который реально! выцепляет ваш ип, потому как запускается у вас на компе. (кому нужен - пишите в личку)
2. Это посмотреть как сделана защита в чате бородина (реклама [censored 2] ) там идет сбор всех плагинов версии и параметров что есть на машине, кодирует и все. Это более-менее уникальный код
..

Но запомните: если надо пройти - пройдут.
Через прокси, впн, браузеры сменят, яву отключат, но пройдут.


100% защиты небывает  smile  smile 
--
пс : кому помог - респектики ;)

Вопрос к тему чату бородина и вычисления реального IP.

Объесняю на пальцах. Для того что бы чат Бородина работал во всех браузерах нужно повесить веб сервер и демона чата на один порт (к примеру 80) и как это сделать ? 
А сделать это просто. Нужно поставить определеный веб сервер на порт 80 который бы при посылке запроса смотрел правила и рулил запрос куда надо. Если запрос к апачу рулил бы на апач (порт апача к примеру 8080), а если к чату то рулил бы на демон чата (порт к примеру 8888). Вся трабла в том что при таком методе IP клиенту присваивался бы веб сервера что бы привело к бану сети т.е. демон чата забанил бы сам себя. Задача сделать так что бы сохранить реальный IP пользователя при перенаправлении запросов. 

Автор: NetFlame 4.9.2007, 19:24
Вы гении.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)