Проверка IP юзера и сверка с базой

CW
На сайте с 07.09.2005
Offline
158
1531

Приветствую. Есть задача проверять IP посетителя сайта. Для этого используется такой вариант:

function getCOUNTRY($ip) {

$ipnum = sprintf("%u", ip2long($ip));
$result = mysql_query("SELECT cc FROM geoip_db WHERE start <= ".$ipnum." AND end >= ".$ipnum." LIMIT 1");
if($result) {
$row = mysql_fetch_array($result);
if($row) {
$cc = $row[cc];
} else {
$cc = "-";
}
} else {
$cc = "-";
}

return $cc;
}

Т.е. получаем IP, сверяем с нашей базой диапазонов в мускуле и присваиваем регион (переменная сс).

Возникла проблема: много юзеров за NAT. Соответственно, там диапазоны от 10.0 и реального IP при подобной проверке, как у нас в скрипте, не видно. В то же время, сам сервер спокойно себе определяет реальный IP юзеров за NAT (видно в логах, определяет корректно).

Вопрос: как бы сделать дополнительную проверку, используя сам серв. Т.е. примерно так: определяем IP сервером, потом подставляем в скрипт и уже после этого лезем в базу и сверяем-присваиваем регион?

ClockWorkOrange добавил 21.02.2011 в 02:15

Вот сама функция, которая вызывается:

function getip() {

if(getenv("HTTP_CLIENT_IP")) {
$ip = getenv("HTTP_CLIENT_IP");
} elseif(getenv("HTTP_X_FORWARDED_FOR")) {
$ip = getenv("HTTP_X_FORWARDED_FOR");
} else {
$ip = getenv("REMOTE_ADDR");
}
$ip = htmlspecialchars(substr($ip,0,15), ENT_QUOTES);
return $ip;
}

Вроде все ок, но на деле не работает, если юзер за NAT.

Сквозь холод тумана шагаю в пальтишке Куплю сайтов с Adsense или еще что-нибудь
LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#1

Как бы расширенная:

function getip()

{

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'];

else

$ip = "unknown";

return($ip);

}

если юзер за NAT

А что чей он должен отображать?!

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
CW
На сайте с 07.09.2005
Offline
158
#2

Простеньким скриптом посмотрел, что отдает функция

<?php

echo 'HTTP_CLIENT_IP '.$_SERVER["HTTP_CLIENT_IP"];
echo '<br/>';
echo 'REMOTE_ADDR '.$_SERVER["REMOTE_ADDR"];
echo '<br/>';
echo 'HTTP_X_FORWARDED_FOR '.$_SERVER["HTTP_X_FORWARDED_FOR"];
?>

Получилось так:

HTTP_CLIENT_IP

REMOTE_ADDR 80.239.242.82

HTTP_X_FORWARDED_FOR 10.206.6.68. 11.11.11.11 (тут был нормальный IP), 80.239.242.82

Где 80.239.242.82 - это кеш-сервер моб. оперы, 11.11.11.11 - реальный IP

Значит, задача получается такой: для моб. устройств выдирать HTTP_X_FORWARD_FOR второе значение. ТАк?

ClockWorkOrange добавил 21.02.2011 в 05:00

LEOnidUKG:
Как бы расширенная:
function getip()

Работает корректно. Спасибо, буду тестировать. 🍾

CW
На сайте с 07.09.2005
Offline
158
#3

Протестировал, работает некорректно. Задача в следующем:

Если запустить вот такой скрипт, то отображается 2 ip. Первый - реальный, нормальный, второй через запятую - ip кэш-сервера Оперы.

<?php

function GetRealIp()
{
if (!empty($_SERVER['HTTP_CLIENT_IP']))
{
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
{
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}

return $ip;
}

echo(getRealIp());
?>

Что нужно дописать в функцию, чтобы не отображать второй IP в этом списке, если он есть?

В настоящий момент, при просмотре с мобильной оперы скрипт выдает следующее:

11.11.11.11, 22.22.22.22 (где 11.11.11.11 - наш нормальный ip, 22.22.22.22 - ip кэш-сервера)

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

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#4

$tmpx=explode(',',getRealIp());

echo $tmpx[0];

CW
На сайте с 07.09.2005
Offline
158
#5
LEOnidUKG:
$tmpx=explode(',',getRealIp());
echo $tmpx[0];

Приактически Бинго. Но отображение это был пример. Нам нужно его не отображать, а передавать в обработку, уже порезаным от второго значения.

Т.е., примерно было так:

function getip()

{
if (!empty($_SERVER['HTTP_CLIENT_IP']))
{
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
{
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
$ip=$_SERVER['REMOTE_ADDR'];
}
$ip = htmlspecialchars(substr($ip,0,15), ENT_QUOTES);
return $ip;

}

и дальше мы передаем все скрипту, это в коде наравне с определением браузера и т.д.:

$ip         = getip();	

Вот не понимаю как в этом контексте передать. Просто вырезаем через explode прямо в функции и все?

И вот в таком контексте тоже интересует как быть:

static public function getIp()

{
return isset($_SERVER['HTTP_X_FORWARDED_FOR'])
? $_SERVER['HTTP_X_FORWARDED_FOR']
: $_SERVER['REMOTE_ADDR'];
}
LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#6
Просто вырезаем через explode прямо в функции и все?

Да.

10 да. :)

[Удален]
#7

а не надо использовать недокументированные возможности )

http://php.net/manual/en/reserved.variables.server.php

$_SERVER['REMOTE_ADDR'] - это будет айпи клиента (если у него выделенный), прокси(если он через прокси), нат сервера (если за натом)

$_SERVER['HTTP_CLIENT_IP'] - локальный айпи клиента за прокси(если прокси не анонимный) или натом. или реальный, если такой

HTTP_X_FORWARDED_FOR - локальный айпи за прокси, если прокси не анонимный.

обращаю внимание, что последние две директивы недокументированы

function getPublicIp(){
if ( !empty($_SERVER) && isset($_SERVER['REMOTE_ADDR']) )
{
return $_SERVER['REMOTE_ADDR'];
}
else if ( !empty($_ENV) && isset($_ENV['REMOTE_ADDR']) )
{
return $_ENV['REMOTE_ADDR'];
}
else if ( !empty($HTTP_SERVER_VARS) && isset($HTTP_SERVER_VARS['REMOTE_ADDR']) )
{
return $HTTP_SERVER_VARS['REMOTE_ADDR'];
}
else if ( !empty($HTTP_ENV_VARS) && isset($HTTP_ENV_VARS['REMOTE_ADDR']) )
{
return $HTTP_ENV_VARS['REMOTE_ADDR'];
}
else if ( @getenv('REMOTE_ADDR') )
{
return getenv('REMOTE_ADDR');
}
}
function getBehindProxyIp()
{
$proxy_ip = '';
if ( !empty($_SERVER) && isset($_SERVER['HTTP_X_FORWARDED_FOR']) )
{
$proxy_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
else if ( !empty($_ENV) && isset($_ENV['HTTP_X_FORWARDED_FOR']) )
{
$proxy_ip = $_ENV['HTTP_X_FORWARDED_FOR'];
}
else if ( !empty($HTTP_SERVER_VARS) && isset($HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR']) )
{
$proxy_ip = $HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR'];
}
else if ( !empty($HTTP_ENV_VARS) && isset($HTTP_ENV_VARS['HTTP_X_FORWARDED_FOR']) )
{
$proxy_ip = $HTTP_ENV_VARS['HTTP_X_FORWARDED_FOR'];
}
else if ( @getenv('HTTP_X_FORWARDED_FOR') )
{
$proxy_ip = getenv('HTTP_X_FORWARDED_FOR');
}
else if ( !empty($_SERVER) && isset($_SERVER['HTTP_X_FORWARDED']) )
{
$proxy_ip = $_SERVER['HTTP_X_FORWARDED'];
}
else if ( !empty($_ENV) && isset($_ENV['HTTP_X_FORWARDED']) )
{
$proxy_ip = $_ENV['HTTP_X_FORWARDED'];
}
else if ( !empty($HTTP_SERVER_VARS) && isset($HTTP_SERVER_VARS['HTTP_X_FORWARDED']) )
{
$proxy_ip = $HTTP_SERVER_VARS['HTTP_X_FORWARDED'];
}
else if ( !empty($HTTP_ENV_VARS) && isset($HTTP_ENV_VARS['HTTP_X_FORWARDED']) )
{
$proxy_ip = $HTTP_ENV_VARS['HTTP_X_FORWARDED'];
}
else if ( @getenv('HTTP_X_FORWARDED') )
{
$proxy_ip = getenv('HTTP_X_FORWARDED');
}
else if ( !empty($_SERVER) && isset($_SERVER['HTTP_FORWARDED_FOR']) )
{
$proxy_ip = $_SERVER['HTTP_FORWARDED_FOR'];
}
else if ( !empty($_ENV) && isset($_ENV['HTTP_FORWARDED_FOR']) )
{
$proxy_ip = $_ENV['HTTP_FORWARDED_FOR'];
}
else if ( !empty($HTTP_SERVER_VARS) && isset($HTTP_SERVER_VARS['HTTP_FORWARDED_FOR']) )
{
$proxy_ip = $HTTP_SERVER_VARS['HTTP_FORWARDED_FOR'];
}
else if ( !empty($HTTP_ENV_VARS) && isset($HTTP_ENV_VARS['HTTP_FORWARDED_FOR']) )
{
$proxy_ip = $HTTP_ENV_VARS['HTTP_FORWARDED_FOR'];
}
else if ( @getenv('HTTP_FORWARDED_FOR') )
{
$proxy_ip = getenv('HTTP_FORWARDED_FOR');
}
else if ( !empty($_SERVER) && isset($_SERVER['HTTP_FORWARDED']) )
{
$proxy_ip = $_SERVER['HTTP_FORWARDED'];
}
else if ( !empty($_ENV) && isset($_ENV['HTTP_FORWARDED']) )
{
$proxy_ip = $_ENV['HTTP_FORWARDED'];
}
else if ( !empty($HTTP_SERVER_VARS) && isset($HTTP_SERVER_VARS['HTTP_FORWARDED']) )
{
$proxy_ip = $HTTP_SERVER_VARS['HTTP_FORWARDED'];
}
else if ( !empty($HTTP_ENV_VARS) && isset($HTTP_ENV_VARS['HTTP_FORWARDED']) )
{
$proxy_ip = $HTTP_ENV_VARS['HTTP_FORWARDED'];
}
else if ( @getenv('HTTP_FORWARDED') )
{
$proxy_ip = getenv('HTTP_FORWARDED');
}
else if ( !empty($_SERVER) && isset($_SERVER['HTTP_VIA']) )
{
$proxy_ip = $_SERVER['HTTP_VIA'];
}
else if ( !empty($_ENV) && isset($_ENV['HTTP_VIA']) )
{
$proxy_ip = $_ENV['HTTP_VIA'];
}
else if ( !empty($HTTP_SERVER_VARS) && isset($HTTP_SERVER_VARS['HTTP_VIA']) )
{
$proxy_ip = $HTTP_SERVER_VARS['HTTP_VIA'];
}
else if ( !empty($HTTP_ENV_VARS) && isset($HTTP_ENV_VARS['HTTP_VIA']) )
{
$proxy_ip = $HTTP_ENV_VARS['HTTP_VIA'];
}
else if ( @getenv('HTTP_VIA') )
{
$proxy_ip = getenv('HTTP_VIA');
}
else if ( !empty($_SERVER) && isset($_SERVER['HTTP_X_COMING_FROM']) )
{
$proxy_ip = $_SERVER['HTTP_X_COMING_FROM'];
}
else if ( !empty($_ENV) && isset($_ENV['HTTP_X_COMING_FROM']) )
{
$proxy_ip = $_ENV['HTTP_X_COMING_FROM'];
}
else if ( !empty($HTTP_SERVER_VARS) && isset($HTTP_SERVER_VARS['HTTP_X_COMING_FROM']) )
{
$proxy_ip = $HTTP_SERVER_VARS['HTTP_X_COMING_FROM'];
}
else if ( !empty($HTTP_ENV_VARS) && isset($HTTP_ENV_VARS['HTTP_X_COMING_FROM']) )
{
$proxy_ip = $HTTP_ENV_VARS['HTTP_X_COMING_FROM'];
}
else if ( @getenv('HTTP_X_COMING_FROM') )
{
$proxy_ip = getenv('HTTP_X_COMING_FROM');
}
else if ( !empty($_SERVER) && isset($_SERVER['HTTP_COMING_FROM']) )
{
$proxy_ip = $_SERVER['HTTP_COMING_FROM'];
}
else if ( !empty($_ENV) && isset($_ENV['HTTP_COMING_FROM']) )
{
$proxy_ip = $_ENV['HTTP_COMING_FROM'];
}
else if ( !empty($HTTP_COMING_FROM) && isset($HTTP_SERVER_VARS['HTTP_COMING_FROM']) )
{
$proxy_ip = $HTTP_SERVER_VARS['HTTP_COMING_FROM'];
}
else if ( !empty($HTTP_ENV_VARS) && isset($HTTP_ENV_VARS['HTTP_COMING_FROM']) )
{
$proxy_ip = $HTTP_ENV_VARS['HTTP_COMING_FROM'];
}
else if ( @getenv('HTTP_COMING_FROM') )
{
$proxy_ip = getenv('HTTP_COMING_FROM');
}

if ( empty($proxy_ip) )
{
// No proxy
return FALSE;
}
else
{
$is_ip = preg_match('^([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 TRUE;
}
}
}

нарыл надежный код для определения айпи. похоже он под пхп 3/4 писался еще. но суть тут видна чуть более, чем полностью

CW
На сайте с 07.09.2005
Offline
158
#8

А в этом моменте как поступить?

static public function getIp()

{
return isset($_SERVER['HTTP_X_FORWARDED_FOR'])
? $_SERVER['HTTP_X_FORWARDED_FOR']
: $_SERVER['REMOTE_ADDR'];
}
а не надо использовать недокументированные возможности )

Да это я такой продукт уже на руки получил. За свои кровные :)

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#9

static public function getIp()

{

$tmpx=isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];

$tmpx=explode(',',getRealIp());

return $tmpx[0];

}

ну или по нормальному:

static public function getIp()

{

$tmpx=$_SERVER['REMOTE_ADDR']; if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {$tmpx=$_SERVER['HTTP_X_FORWARDED_FOR']};

$tmpx=explode(',',getRealIp());

return $tmpx[0];

}

CW
На сайте с 07.09.2005
Offline
158
#10
LEOnidUKG:
static public function getIp()
{
$tmpx=isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
$tmpx=explode(',',getRealIp());
return $tmpx[0];

}

ну или по нормальному:

static public function getIp()
{
$tmpx=$_SERVER['REMOTE_ADDR']; if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {$tmpx=$_SERVER['HTTP_X_FORWARDED_FOR']};
$tmpx=explode(',',getRealIp());
return $tmpx[0];
}

Если "по нормальному", то работать не хочет. Отписал в личку.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий