[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: IP
andrey888
Приветствую парни . Есть небольшая непонятка .
При введении комента поситителем сайта хочу узнать его IP , и всего то .
Делаем раз :
$ip=$_SERVER['REMOTE_ADDR'];

пишу собственноручно коментарий , проверяю в админке свой комент и уже написанные коменты других поситителей - один и тот же IP . 0_о . Возможно "Делаем раз" не достаточно .
Делаем два :
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 адресс один и то же .
Вопрос . Я что то упустил ? или может такое быть, что это проделки (для повышения безопасности) хостинга ?
Благодарю за ответы.



Спустя 7 часов, 35 минут, 47 секунд (4.09.2011 - 07:06) Белый Тигр написал(а):
Напишите скрипт, который выводит содержимое всех этих переменных. Затем обратитесь к нему со своего компьютера, и с анонимайзеров. Например с kalarupa.com - там можно выбирать страну обращения. Если во всех случаях данные в переменных окружения остаются одни и теже - пишите хостеру. Скорее всего неверно настроен либо сервер, проксирующий http-запросы (ставится между клиентом и итоговым веб-сервером для различных нужд), либо конечный веб-сервер.
Функция ip() уж слишком закручена smile.gif unknown быть при верной настройке веб-сервера просто не может быть.

Спустя 4 часа, 7 минут, 38 секунд (4.09.2011 - 11:14) andrey888 написал(а):
Спасибо за ответ . Переделал вторую функцию - выдала мой реальный IP , оказалось что он находится в
$_SERVER['HTTP_X_FORWARDED_FOR']

В связи с этим 2 вопроса :
1) что лучше использовать $_SERVER или getenv() , насколько я понимаю getenv() может не работать, если РНР установлен на IIS , но при этом и в массиве $_SERVER может не быть всех переменных .
2) в $_SERVER['HTTP_X_FORWARDED_FOR'] может быть запихано много ненужностей , как лучше ( в плане быстрее но при этом надежно ) проверить эту переменную и получить только IP .
Благодарю.

Спустя 32 минуты, 44 секунды (4.09.2011 - 11:46) Nikitian написал(а):
В очередной раз выкладываю функцию, которую утянул из pma. Кинул бы ссылку на поиск, но поиск здесь является алиасом рандома (
get_ip()

/**
* Вычисляет ip-адрес
*
@global type $REMOTE_ADDR
*
@global type $HTTP_X_FORWARDED_FOR
*
@global type $HTTP_X_FORWARDED
*
@global type $HTTP_FORWARDED_FOR
*
@global type $HTTP_FORWARDED
*
@global type $HTTP_VIA
*
@global type $HTTP_X_COMING_FROM
*
@global type $HTTP_COMING_FROM
*
@global type $HTTP_SERVER_VARS
*
@global type $HTTP_ENV_VARS
*
@return string
*/

function get_ip(){
global $REMOTE_ADDR;
global $HTTP_X_FORWARDED_FOR, $HTTP_X_FORWARDED, $HTTP_FORWARDED_FOR, $HTTP_FORWARDED;
global $HTTP_VIA, $HTTP_X_COMING_FROM, $HTTP_COMING_FROM;
global $HTTP_SERVER_VARS, $HTTP_ENV_VARS;
// Get some server/environment variables values
if(empty($REMOTE_ADDR))
{
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(!empty($HTTP_SERVER_VARS) && isset($HTTP_SERVER_VARS['REMOTE_ADDR']))
{
$REMOTE_ADDR = $HTTP_SERVER_VARS['REMOTE_ADDR'];
}
elseif(!empty($HTTP_ENV_VARS)&&isset($HTTP_ENV_VARS['REMOTE_ADDR']))
{
$REMOTE_ADDR = $HTTP_ENV_VARS['REMOTE_ADDR'];
}
elseif(@getenv('REMOTE_ADDR'))
{
$REMOTE_ADDR = getenv('REMOTE_ADDR');
}
}
// end if
if(empty($HTTP_X_FORWARDED_FOR))
{
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(!empty($HTTP_SERVER_VARS) && isset($HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR']))
{
$HTTP_X_FORWARDED_FOR = $HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR'];
}
elseif(!empty($HTTP_ENV_VARS) && isset($HTTP_ENV_VARS['HTTP_X_FORWARDED_FOR']))
{
$HTTP_X_FORWARDED_FOR = $HTTP_ENV_VARS['HTTP_X_FORWARDED_FOR'];
}
elseif(@getenv('HTTP_X_FORWARDED_FOR'))
{
$HTTP_X_FORWARDED_FOR = getenv('HTTP_X_FORWARDED_FOR');
}
}
// end if
if(empty($HTTP_X_FORWARDED))
{
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(!empty($HTTP_SERVER_VARS) && isset($HTTP_SERVER_VARS['HTTP_X_FORWARDED']))
{
$HTTP_X_FORWARDED = $HTTP_SERVER_VARS['HTTP_X_FORWARDED'];
}
elseif(!empty($HTTP_ENV_VARS) && isset($HTTP_ENV_VARS['HTTP_X_FORWARDED']))
{
$HTTP_X_FORWARDED = $HTTP_ENV_VARS['HTTP_X_FORWARDED'];
}
elseif(@getenv('HTTP_X_FORWARDED'))
{
$HTTP_X_FORWARDED = getenv('HTTP_X_FORWARDED');
}
}
// end if
if(empty($HTTP_FORWARDED_FOR))
{
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(!empty($HTTP_SERVER_VARS) && isset($HTTP_SERVER_VARS['HTTP_FORWARDED_FOR']))
{
$HTTP_FORWARDED_FOR = $HTTP_SERVER_VARS['HTTP_FORWARDED_FOR'];
}
elseif(!empty($HTTP_ENV_VARS) && isset($HTTP_ENV_VARS['HTTP_FORWARDED_FOR']))
{
$HTTP_FORWARDED_FOR = $HTTP_ENV_VARS['HTTP_FORWARDED_FOR'];
}
elseif(@getenv('HTTP_FORWARDED_FOR'))
{
$HTTP_FORWARDED_FOR = getenv('HTTP_FORWARDED_FOR');
}
}
// end if
if(empty($HTTP_FORWARDED))
{
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(!empty($HTTP_SERVER_VARS) && isset($HTTP_SERVER_VARS['HTTP_FORWARDED']))
{
$HTTP_FORWARDED = $HTTP_SERVER_VARS['HTTP_FORWARDED'];
}
elseif(!empty($HTTP_ENV_VARS) && isset($HTTP_ENV_VARS['HTTP_FORWARDED']))
{
$HTTP_FORWARDED = $HTTP_ENV_VARS['HTTP_FORWARDED'];
}
elseif(@getenv('HTTP_FORWARDED'))
{
$HTTP_FORWARDED = getenv('HTTP_FORWARDED');
}
}
// end if
if(empty($HTTP_VIA))
{
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(!empty($HTTP_SERVER_VARS) && isset($HTTP_SERVER_VARS['HTTP_VIA']))
{
$HTTP_VIA = $HTTP_SERVER_VARS['HTTP_VIA'];
}
elseif(!empty($HTTP_ENV_VARS) && isset($HTTP_ENV_VARS['HTTP_VIA']))
{
$HTTP_VIA = $HTTP_ENV_VARS['HTTP_VIA'];
}
elseif(@getenv('HTTP_VIA'))
{
$HTTP_VIA = getenv('HTTP_VIA');
}
}
// end if
if(empty($HTTP_X_COMING_FROM))
{
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(!empty($HTTP_SERVER_VARS) && isset($HTTP_SERVER_VARS['HTTP_X_COMING_FROM']))
{
$HTTP_X_COMING_FROM = $HTTP_SERVER_VARS['HTTP_X_COMING_FROM'];
}
elseif(!empty($HTTP_ENV_VARS) && isset($HTTP_ENV_VARS['HTTP_X_COMING_FROM']))
{
$HTTP_X_COMING_FROM = $HTTP_ENV_VARS['HTTP_X_COMING_FROM'];
}
elseif(@getenv('HTTP_X_COMING_FROM'))
{
$HTTP_X_COMING_FROM = getenv('HTTP_X_COMING_FROM');
}
}
// end if
if(empty($HTTP_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(!empty($HTTP_COMING_FROM) && isset($HTTP_SERVER_VARS['HTTP_COMING_FROM']))
{
$HTTP_COMING_FROM = $HTTP_SERVER_VARS['HTTP_COMING_FROM'];
}
elseif(!empty($HTTP_ENV_VARS) && isset($HTTP_ENV_VARS['HTTP_COMING_FROM']))
{
$HTTP_COMING_FROM = $HTTP_ENV_VARS['HTTP_COMING_FROM'];
}
elseif(@getenv('HTTP_COMING_FROM'))
{
$HTTP_COMING_FROM = getenv('HTTP_COMING_FROM');
}
}
// end if
// Gets the default ip sent by the user

if(!empty($REMOTE_ADDR))
{
$direct_ip = $REMOTE_ADDR;
}
// Gets the proxy ip sent by the user
$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;
// Returns the true IP if it has been found, else FALSE
if (empty($proxy_ip))
{
// True IP without proxy
return $direct_ip;
}
else
{
if(!function_exists('ereg')){
return false;
}
$is_ip = ereg('^([0-9]{1,3}\.){3,3}[0-9]{1,3}', $proxy_ip, $regs);
if($is_ip && (count($regs) > 0))
{
// True IP behind a proxy
return $regs[0];
}
else
{
// Can't define IP: there is a proxy but we don't have
// information about the true IP

return FALSE;
}
}
// end if... else...
}


Спустя 1 час, 45 минут, 50 секунд (4.09.2011 - 13:32) Белый Тигр написал(а):
На счёт проблем с getenv() на IIS стоит просто погуглить. IP из X-Forwarded-For можно получить простой регуляркой через preg-match. Что-то типа (пишу не проверяя валидность)
Цитата
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}

Касательно функции из PMA - там нет HTTP_CLIENT_IP и она, судя по использованию $HTTP_*, содержит устаревшие конструкции.
P.S. Не забывайте о том что любые заголовки начинающиеся с HTTP_ могут произвольно формироваться клиентом. Если в HTTP_X_FORWARDED_FOR адрес кладётся проксирующим веб-сервером хостера, то этому можно хоть как-то доверять, но я бы на вашем месте отправил скрипту запрос с уже заполненным X-Forwarded-For и посмотрел бы что из этого выйдет.

Спустя 2 дня, 1 час, 44 минуты, 23 секунды (6.09.2011 - 15:17) andrey888 написал(а):
Да и насчет функции ereg на самом мануале уже написано , что не стоит .. Но спасибо за содействие Nikitian .
Белый Тигр ты пользуешься getenv() или $_SERVER[] ?
Спасибо за ответы .

Спустя 1 час, 13 минут, 2 секунды (6.09.2011 - 16:30) Белый Тигр написал(а):
$_SERVER


_____________
Прогноз на следующие 5 лет : Россия, Китай - две величайшие державы.
США в Ж*пе. Справедливость восторжествует. )
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.