[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Php определение ip
Faiq88
Здравствуйте,я тестирую свой php код на денвере,по сетке клиент должен обращаться к скрипту,при этом я должен фиксировать его ip,я использую следующую конструкцию для определения ip:

$ip=$_SERVER['REMOTE_ADDR'];

при этом если пользователь использует firefox то его ip не правильно фиксируется,если же другие браузеры,то проблем не возникает,ip регистрируется правильно.Не знаете ли вы в чем проблема и как ее решить.Заранее спасибо.



Спустя 3 минуты, 18 секунд (6.07.2011 - 21:37) VolDroN написал(а):
а что выдаёт при использовании firefoxа?

Спустя 12 минут, 56 секунд (6.07.2011 - 21:50) Faiq88 написал(а):
Выдаёт другой ip,причем у все пользователей выдает один и тот же ,но если они заходят через любой другой браузер,то фиксируется правильный ip их компа.

Спустя 5 минут, 12 секунд (6.07.2011 - 21:56) killer8080 написал(а):
может у него ФФ через прокси работает?
А что в $_SERVER['HTTP_X_REAL_IP'] и $_SERVER['HTTP_VIA']?

Спустя 8 минут, 45 секунд (6.07.2011 - 22:04) Faiq88 написал(а):
Я попробовал,
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
теперь ФФ работает,а другие нет

Спустя 7 минут, 34 секунды (6.07.2011 - 22:12) DySprozin написал(а):
Faiq88
юзай оба варианта (;

Спустя 16 секунд (6.07.2011 - 22:12) neadekvat написал(а):
Ну, так и решение предельно простое: если существует HTTP_X_FORWARDED_FOR, используешь его, если не существует - используешь REMOTE_ADDR.

Спустя 22 секунды (6.07.2011 - 22:13) kirik написал(а):
Faiq88
Проверьте, вероятно ваш ФФ выходит в интернет через прокси сервер (проверить это можно в настройках самого ФФ).
REMOTE_ADDR - это "настоящий" ip. Все остальные HTTP_* устанавливаются либо браузером, либо прокси сервером.

Спустя 2 минуты, 12 секунд (6.07.2011 - 22:15) Faiq88 написал(а):
$_SERVER['HTTP_X_REAL_IP'] не сработал и во все,а $_SERVER['HTTP_VIA'] работает как и $_SERVER['HTTP_X_FORWARDED_FOR'],наверное,нужно написать функцию которая в зависимости от браузера использует нужный метод.



Спустя 7 минут, 12 секунд Faiq88 написал(а):
Ок,всем спасибо,всё получилось,вот итог:

if (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
{
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
$ip=$_SERVER['REMOTE_ADDR'];
}

Спустя 10 минут, 56 секунд (6.07.2011 - 22:26) neadekvat написал(а):
По-моему, isset подойдет больше, т.к. если значения нет, то не существует индекс вообще.
Да и можно сократить малясь:
$ip = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR']
:
$_SERVER['REMOTE_ADDR'];

Спустя 20 минут, 9 секунд (6.07.2011 - 22: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...
}


Спустя 11 минут, 16 секунд (6.07.2011 - 22:57) neadekvat написал(а):
Свернутый текст
Nikitian, я тут подумал, как бы выглядила эта функция, построенная на основе тернарного оператора..

Спустя 20 минут, 6 секунд (6.07.2011 - 23:17) killer8080 написал(а):
Цитата (Faiq88 @ 6.07.2011 - 22:22)
Ок,всем спасибо,всё получилось,вот итог:

if (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
{
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
$ip=$_SERVER['REMOTE_ADDR'];
}

смотря для каких целей нужен IP. Если в целях бана по IP, то такой подход неприемлем. Боту достаточно будет отправлять левые заголовки, чтобы обмануть защиту.

Спустя 1 минута, 33 секунды (6.07.2011 - 23:19) neadekvat написал(а):
Цитата (killer8080 @ 7.07.2011 - 00:17)
Если в целях бана по IP

Этот метод вообще должен умереть и никогда не появляться.

Спустя 1 минута, 53 секунды (6.07.2011 - 23:21) killer8080 написал(а):
neadekvat
спорное утверждение smile.gif

Спустя 7 минут, 44 секунды (6.07.2011 - 23:28) neadekvat написал(а):
Цитата (killer8080 @ 7.07.2011 - 00:21)
спорное утверждение

Да прям?
Те, против кого направлен бан по ip, умеют его обходить путем смены прокси сервера (или путем его включения). Таким образом, страдают обычные пользователи. Особенно если учесть средний урвоень админов на среднем форуме: "Агаа, у него небось динамический ip, значит, забаню по подсети", и все, целый регион зайти уже не может.

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

Спустя 8 минут, 56 секунд (6.07.2011 - 23:37) Nikitian написал(а):
Цитата (neadekvat @ 6.07.2011 - 22:57)
Свернутый текст
Nikitian, я тут подумал, как бы выглядила эта функция, построенная на основе тернарного оператора..

а я даже не думал: полностью поддерживаю
первое правило программирования
Если работает, то ничего не трогай

Спустя 3 минуты, 47 секунд (6.07.2011 - 23:41) killer8080 написал(а):
Всё зависит от конкретной ситуации. У меня был случай когда бот напрямую, без проксей слал каждые 2 минуты посты. Я связался с тех поддержкой хостинга, где висел бот. Админы наотрез отказались решать эту проблему, сославшись, что крон задания у них добавляются автоматически клиентами и для них просто нереально сложно их отследить, и сами посоветовали мне забанить IP laugh.gif
Хотя в целом ты конечно прав, в тупую банить нельзя и уж тем более подсетями.

Спустя 9 часов, 30 минут, 17 секунд (7.07.2011 - 09:11) Mirexzpalich написал(а):
neadekvat
Тенерный оператор в PHP имеет подводный камень =)

Спустя 2 часа, 48 минут, 13 секунд (7.07.2011 - 12:00) Winston написал(а):
Цитата (Mirexzpalich @ 7.07.2011 - 09:11)
Тенерный оператор в PHP имеет подводный камень

Интересно какой ?

Спустя 2 часа, 10 минут, 47 секунд (7.07.2011 - 14:10) Mirexzpalich написал(а):
PHPprogramer

Посмотри что получится:

echo (2>1)?'2>1':((1>0)?'1>0':'0>=1');
echo (2>1)?'2>1':(1>0)?'1>0':'0>=1';

Спустя 42 минуты, 48 секунд (7.07.2011 - 14:53) neadekvat написал(а):
Mirexzpalich, я помню, что что-то там есть, но что именно - не знаю и знать не хочу, если честно. И без того хватает багов, которые приходится решать "влоб". В случаи же с тернарным оператором избежать проблем просто - не усложнять его smile.gif

Спустя 27 минут, 16 секунд (7.07.2011 - 15:20) DySprozin написал(а):
;;Посмотри что получится
вложенные тернарны? о да, мисье определенно знает толк в извращениях laugh.gif
а другие подводные камни есть? (;

Спустя 6 часов, 6 минут, 50 секунд (7.07.2011 - 21:27) Mirexzpalich написал(а):
DySprozin
По-моему красивее

echo (2>1)?'2>1':((1>0)?'1>0':'0>=1');

Чем

if(2>1)
echo '2>1';
else
echo (1>0)?'1>0':'0>=1';


Прошу заметить, я этичный извращенец...

Спустя 4 минуты, 24 секунды (7.07.2011 - 21:32) DySprozin написал(а):
;;По-моему красивее
красивее, не спорю (; но читать и править второй код - ИМХО проще, хотя можт это дело привычки, не знаю (;

хотя как по мне, то лучше стили не мешать:

if (2>1) echo '2>1';
elseif (1>0) echo '1>0';
else echo '0>=1';

Спустя 4 дня, 5 часов, 47 минут, 21 секунда (12.07.2011 - 03:19) YVSIK написал(а):
посмотрел тут и вот, что я читал думаю, что это все читали
вот это http://phpfaq.ru/ip
может есть ещё лучше статьи про IP адрес
скиньте пожалста))) rolleyes.gif
а так пришол к выводу что точно IP адрес не папнацея от всех бед и бот

Спустя 5 часов, 42 минуты, 8 секунд (12.07.2011 - 09:01) killer8080 написал(а):
Цитата (YVSIK @ 12.07.2011 - 03:19)
может есть ещё лучше статьи про IP адрес

статей может быть сколько угодно, но суть дела от этого не меняется. В той статье автор полностью раскрывает тему, не забыл даже про криворуких админов (когда апач стоит бэкэндом), написано толково. А что ты хочешь найти в других статьях?

Спустя 2 часа, 31 минута, 32 секунды (12.07.2011 - 11:33) ИНСИ написал(а):
function getip() {
$ip = '0';
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"),"unknown"))
$ip = getenv("HTTP_CLIENT_IP");
elseif (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
elseif (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
$ip = getenv("REMOTE_ADDR");
elseif (!empty($_SERVER['REMOTE_ADDR']) && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
$ip = $_SERVER['REMOTE_ADDR'];

return $ip;
}


Нашел где-то у себя в скриптах ... :)

Спустя 1 час, 11 минут, 21 секунда (12.07.2011 - 12:44) killer8080 написал(а):
INSIDIOUS
почитай статью, на которую дал ссылку YVSIK, и пропадёт желание использовать подобные, бредовые функции smile.gif

Спустя 53 минуты, 37 секунд (12.07.2011 - 13:38) ИНСИ написал(а):
killer8080 с чего ты решил что я не знал это и не читал? Эти функции надо использовать в обычных скриптах, где выполняют обычную функциональность, но использовать их в качестве безопасности или бана, полный бред и многие это знают.

Спустя 24 минуты, 55 секунд (12.07.2011 - 14:03) killer8080 написал(а):
INSIDIOUS
ты меня неправильно понял, речь о том что реальный IP - только REMOTE_ADDR, а любая инфа из заголовков может быть использована только в качестве дополнения, то есть отдельно IP, отдельно FORWARDED_FOR, VIA и прочие.
Цитата (INSIDIOUS @ 12.07.2011 - 13:38)
но использовать их в качестве безопасности или бана, полный бред и многие это знают.

Привязка сессий к IP, это то же в целях безопасности wink.gif , а о бане речь не идёт.
Быстрый ответ:

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