Модераторы: Aliance, skyboy, MoLeX, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ip адресс посетителя средствами Php, ip адресс посетителя средствами Php 
:(
    Опции темы
supervladislav
Дата 27.7.2006, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


///\\\///\\\///\\\
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 18.5.2006

Репутация: -1
Всего: -9



может кто знает ,можно-ли узнать ip посетителя вашей страницы средствами php,в java енто делается одной командой ,думаю в пхп тоже есть чегонить подобное. 
p.s:а кстате  скажите если не очистить от тегов сообщение из формы ,
то если вписать туда пхп  скрипт он выполнится? 
PM MAIL   Вверх
faost
Дата 27.7.2006, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 5.11.2004

Репутация: нет
Всего: 2



Цитата

можно-ли узнать ip посетителя вашей страницы средствами php

echo $_SERVER['REMOTE_ADDR'];

Цитата

p.s:а кстате  скажите если не очистить от тегов сообщение из формы ,
то если вписать туда пхп  скрипт он выполнится?  

Нет, т. к. PHP выполняется на стороне сервера, в отличии от JavaScript 
--------------------
Если у вас нет проблем, значит вы уже умерли
PM MAIL   Вверх
szz
Дата 27.7.2006, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1289
Регистрация: 31.5.2005
Где: Moscow, Jerusalem

Репутация: 1
Всего: 33



Цитата
если вписать туда пхп  скрипт он выполнится


  Нте, но если надо (например ты пишешь каой-нибудь свой интерпретатор) - то можно выполнить PHP с помощью eval() 


--------------------
PM   Вверх
cyberface
Дата 28.7.2006, 02:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 6.6.2006

Репутация: нет
Всего: 5



Определяем IP =)
Код

<?php 
    //определяем IP 
function ip(){ 
   if( getenv('REMOTE_ADDR')) 
       {$user_ip = getenv('REMOTE_ADDR');} 
     elseif( getenv('HTTP_FORWARDED_FOR')) 
       {$user_ip = getenv('HTTP_FORWARDED_FOR');} 
     elseif( getenv('HTTP_X_FORWARDED_FOR')) 
       {$user_ip = getenv('HTTP_X_FORWARDED_FOR');} 
     elseif( getenv('HTTP_X_COMING_FROM')) 
       {$user_ip = getenv('HTTP_X_COMING_FROM');} 
     elseif( getenv('HTTP_VIA')) 
       {$user_ip = getenv('HTTP_VIA');} 
     elseif( getenv('HTTP_XROXY_CONNECTION')) 
       {$user_ip = getenv('HTTP_XROXY_CONNECTION');} 
     elseif( getenv('HTTP_CLIENT_IP')) 
       {$user_ip = getenv('HTTP_CLIENT_IP');} 
   else{$user_ip='unknown';} 
   if(15 < strlen($user_ip)){ 
       $ar = split(', ', $user_ip); 
       for($i=sizeof($ar)-1; $i > 0; $i--){ 
          if($ar[$i]!='' and !preg_match('/[a-zA-Zа-яА-Я]/', $ar[$i])) 
          {$user_ip = $ar[$i];  break;   } 
          if($i==sizeof($ar)-1){$user_ip = 'unknown';} 
          } 
       } 
   if(preg_match('/[a-zA-Zа-яА-Я]/', $user_ip)){$user_ip = 'unknown';} 
   return $user_ip; 
} 
    //выводим для программы только первый попавшийся нормальный Ip 
$ip = $user_ip; 
    //-------------------- 
    // здесь идет текст нашего скрипта 
    //-------------------- 
?>
 
PM MAIL   Вверх
Gold Dragon
Дата 28.7.2006, 05:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



cyberface, если не трудно, поясни свой код, желательно каждое условие 


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Alex13
Дата 28.7.2006, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 280
Регистрация: 30.12.2005
Где: Новосибирск

Репутация: нет
Всего: 1



cyberface, присоединяюсь к просьбе. Хочется понять суть скрипта. 


--------------------
Самая страшная ошибка - это ошибка, не имеющая явных причин и конкретных последствий.
Антисоциальный блог.
PM WWW ICQ Jabber   Вверх
GiV
Дата 28.7.2006, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 13.7.2006
Где: rus|53

Репутация: 2
Всего: 9



Я не автор, но суть такая:

Код

if( getenv('REMOTE_ADDR')) {
    // IP адрес есть в переменной окружения REMOTE_ADDR
    // можно написать $_SERVER['REMOTE_ADDR']
    $user_ip = getenv('REMOTE_ADDR');
} 
/**
 * Ниже следующие проверки, проверяют заголовки, содержащие IP-адерса, 
 * возвращаемые прокси-серверами. В принципе они интересны только для
 * определения сидит ли пользователь за прокси-сервером.
 * Однако не все прокси сервера честно отдают такие заголовки. Так что 100%
 * определения не получится! 
 * 
 * Полный перечень таких заголовков:
 * HTTP_X_FORWARDED_FOR, HTTP_X_FORWARDED, HTTP_X_COMING_FROM, HTTP_COMING_FROM
 * HTTP_VIA, HTTP_XROXY_CONNECTION, HTTP_PROXY_CONNECTION
 */
elseif( getenv('HTTP_FORWARDED_FOR')) {
    // IP адрес есть в переменной окружения HTTP_FORWARDED_FOR
    // можно написать $_SERVER['HTTP_FORWARDED_FOR']    
    $user_ip = getenv('HTTP_FORWARDED_FOR');
} elseif( getenv('HTTP_X_COMING_FROM')) {
    // IP адрес есть в переменной окружения HTTP_X_COMING_FROM
    // можно написать $_SERVER['HTTP_X_COMING_FROM']     
    $user_ip = getenv('HTTP_X_COMING_FROM');
} elseif( getenv('HTTP_VIA')) {
    // IP адрес есть в переменной окружения HTTP_VIA
    // можно написать $_SERVER['HTTP_VIA']     
    $user_ip = getenv('HTTP_VIA');
} elseif( getenv('HTTP_XROXY_CONNECTION')) {
    // IP адрес есть в переменной окружения HTTP_XROXY_CONNECTION
    // можно написать $_SERVER['HTTP_XROXY_CONNECTION']     
    $user_ip = getenv('HTTP_XROXY_CONNECTION');
} 
/**
 * IP-адрес отдаваемый в заголовке браузером. 
 * 
 * Может быть подделан!
 */
elseif( getenv('HTTP_CLIENT_IP')) {
    // IP адрес есть в переменной окружения HTTP_CLIENT_IP
    // можно написать $_SERVER['HTTP_CLIENT_IP']      
    $user_ip = getenv('HTTP_CLIENT_IP');
} else {
    // IP из переменных окружения нам выловить не удалось =(
    $user_ip = 'unknown';
} 

/**
 * Проверка правильности формата IP адреса.
 * Максимальная длина строчки IP - 15 символов (255.255.255.255)
 * Возможно что у нас в переменной окружения цепочка IP (обыкновенно
 * встречается в HTTP_X_FORWARDED_FOR)
 */
if(15 < strlen($user_ip)) { 
    // Имеем цепочку IP-адресов разделенных ', '
    $ar = split(', ', $user_ip); 
    // Перебираем массив от конца к началу
    for($i=sizeof($ar)-1; $i > 0; $i--)
    {         
        if($ar[$i]!='' and !preg_match('/[a-zA-Zа-яА-Я]/', $ar[$i])) {
            // нашли запись в массиве не содержащую букв,
            // считаем ее валидным IP-адресом, прекращаем обход массива, 
            // выходим из цикла.
            $user_ip = $ar[$i];  
            break;   
        } 
        
        if($i==sizeof($ar)-1) {
            // пробежали весь массив, ничего валидного не нашли
            $user_ip = 'unknown';
        } 
    } 
} 

/** 
 * Проверка найденого IP-адреса на правильность. 
 * Не должен содержать букв.
 */
if(preg_match('/[a-zA-Zа-яА-Я]/', $user_ip)) {
    // либо где-то раньше user_ip присвоили unknown
    // либо втюхали что-то с буквами
    $user_ip = 'unknown';
} 

return $user_ip;


Как альтернатива, еще такой вариант:
Код

$ips = array();

$ips[] = $_SERVER['REMOTE_ADDR'];

/** 
 * В обратном порядке пробегаем массив содержащий цепочку
 * IP-адресов из HTTP_X_FORWARDED_FOR
 */ 
foreach( array_reverse( explode( ',', $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) as $xff_ip )
{
    $xff_ip = trim($xf_ip);
    
    if ( preg_match( '~^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$~', $xff_ip ) ) {
        // IP-адрес соответствует формату 
        // ЧЧЧ.ЧЧЧ.ЧЧЧ.ЧЧЧ
        $ips[] = $xff_ip;
    }
}
            
$ips[] = $_SERVER['HTTP_CLIENT_IP'];
$ips[] = $_SERVER['HTTP_PROXY_USER']; 

/**
 * Из массива всех собранных IP-адресов найдем первый удовлетворяющий форме
 * ЧЧЧ.ЧЧЧ.ЧЧЧ.ЧЧЧ
 */
foreach ( $ips as $ip )
{
    if ( $ip ) {
        if ( preg_match( '~^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$~', $ip ) ) {
            return $ip;            
        }
    }
}
 
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 28.7.2006, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Бог ты мой, что за изврат?
Ребят, надо быть реалистами. Тем кому надо 100% подделать ИП его подделают. Нафига так извращаться?
Есть более менее реальное решение:
Код

        function kerGetIP()
        {
            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;    
         }

И этого вполне достаточно для определения IP в реальной ситуации. 
PM ICQ   Вверх
GiV
Дата 28.7.2006, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 13.7.2006
Где: rus|53

Репутация: 2
Всего: 9



Порядок вытаскивания IP из окружения не верный. При таком подходе действительно 100% подделают.

Стоит $ip = getenv( "REMOTE_ADDR" );  поставить самым первым, т.е.
Код

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


И потом HTTP_X_FORWARDED_FOR может содержать цепочку IP. 
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 28.7.2006, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Ну не наю, не наю, пока что сбоев не давал... 
PM ICQ   Вверх
GiV
Дата 28.7.2006, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 13.7.2006
Где: rus|53

Репутация: 2
Всего: 9



Код

#!/usr/bin/perl

use LWP::UserAgent;

$url = "http://www.site.ru/ip.php";

$net = LWP::UserAgent->new( ) or die;

$rh = $net->get($url, 'USER_AGENT'=>'', 'CLIENT_IP'=>"hello!");

if ($rh->is_success)
{
  print $rh->as_string;
}


на сервере
Код

function kerGetIP()
{
  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;    
  }
}
         
echo kerGetIP();


Запускаем...
Код

>perl -w ip.pl
HTTP/1.1 200 OK
Connection: close
Date: Fri, 28 Jul 2006 12:45:33 GMT
Server: Apache/1.3.33 (Unix) mod_ipdrop/0.01 mod_gzip/1.3.26.1a mod_auth_passthrough/1.8 mod_log_bytes/1.2 mod_bwlimited/1.4 PHP/4.4.1 FrontPage/5.0.2.2635
Content-Type: text/html
Client-Date: Fri, 28 Jul 2006 12:45:35 GMT
Client-Peer: 66.36.243.78:80
Client-Response-Num: 1
Client-Transfer-Encoding: chunked
X-Powered-By: PHP/4.4.1

hello!
>Exit code: 0    Time: 0.610
 
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 28.7.2006, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



GiV, я вроде говорил выше, что если очень захотеть, то подделать можно. Я имел ввиду, что для узнавания IP обычного человека, который не старается скрыть свой IP, подобными средствами, моего кода достаточно. 
PM ICQ   Вверх
GiV
Дата 28.7.2006, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 13.7.2006
Где: rus|53

Репутация: 2
Всего: 9



Mal Hack,  а я не случайно написал в IP-адресе символьную строчку.
Итак имеется БД - MySQL 4.x.x или 5
У нас реализован собственный механизм сессий, ну отказались мы от стандартных PHP-ых. Все данные сессионные хранятся в таблице БД, а получаем мы их по запросу SELECT lastaction FROM session WHERE sid = '$session_id' AND ipaddress = '$ip';
Пользуясь функцией выше мы получаем IP-адрес. 
Пользуясь скриптом выше злоумышленник передает в качестве IP-адреса строчку ' UNION SELECT 'VULN'/*
Итого результатом "подделки" адреса является SQL-инъекция.

P.S. можно конечно говорить, что запрос надо составлять правильно (addslashes, mysql_escape_string), я с этим 100% согласен, но большинство людей пишет именно так. Если intval() на всяких id еще как-то вдолбили, то на IP-адресе программисты подвоха ждут меньше всего. А он есть, причем очень даже неприятный.

 
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 28.7.2006, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Цитата(GiV @  29.7.2006,  00:37 Найти цитируемый пост)
но большинство людей пишет именно так.

Не помню, как зовут, рок-музыкант заслуженный, Гребенщиков вроде. Дык вот, на вопрос о том, почему все слушают попсу он ответил: "ну если нравится всем [censored33! Пожалуйста, соблюдайте элементарные правила приличия при общении на форуме], так пусть и слушают"... Вот тут тоже самое. не умение программировать элементарные приемы безопасности это проблема псевдо программистов.
В конце концов есть ip2long вроде... 
PM ICQ   Вверх
GiV
Дата 29.7.2006, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 13.7.2006
Где: rus|53

Репутация: 2
Всего: 9



Цитата(Mal Hack @  28.7.2006,  23:56 Найти цитируемый пост)
Вот тут тоже самое. не умение программировать элементарные приемы безопасности это проблема псевдо программистов.

Проблема в том, что тот кто умеет и понимает не хочет писать безопасные решения для тех кто не умеет. Достаточно вставить в Вашу функцию проверку, тот же RegEX в одну строчку, и общая серая масса будет на один шаг ближе к элите. 
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.1066 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.