- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
В 2023 году Google заблокировал более 170 млн фальшивых отзывов на Картах
Это на 45% больше, чем в 2022 году
Оксана Мамчуева
Маркетинг для шоколадной фабрики. На 34% выше средний чек
Через устранение узких мест
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Приветствую. Есть задача проверять 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.
Как бы расширенная:
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);
}
А что чей он должен отображать?!
Простеньким скриптом посмотрел, что отдает функция
Получилось так:
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
Как бы расширенная:
function getip()
Работает корректно. Спасибо, буду тестировать. 🍾
Протестировал, работает некорректно. Задача в следующем:
Если запустить вот такой скрипт, то отображается 2 ip. Первый - реальный, нормальный, второй через запятую - ip кэш-сервера Оперы.
Что нужно дописать в функцию, чтобы не отображать второй IP в этом списке, если он есть?
В настоящий момент, при просмотре с мобильной оперы скрипт выдает следующее:
11.11.11.11, 22.22.22.22 (где 11.11.11.11 - наш нормальный ip, 22.22.22.22 - ip кэш-сервера)
Нужно, чтобы остался только первый ip и, сосбственно, это значение и передавалось дальше скрипту.
$tmpx=explode(',',getRealIp());
echo $tmpx[0];
$tmpx=explode(',',getRealIp());
echo $tmpx[0];
Приактически Бинго. Но отображение это был пример. Нам нужно его не отображать, а передавать в обработку, уже порезаным от второго значения.
Т.е., примерно было так:
и дальше мы передаем все скрипту, это в коде наравне с определением браузера и т.д.:
Вот не понимаю как в этом контексте передать. Просто вырезаем через explode прямо в функции и все?
И вот в таком контексте тоже интересует как быть:
Да.
10 да. :)
а не надо использовать недокументированные возможности )
http://php.net/manual/en/reserved.variables.server.php
$_SERVER['REMOTE_ADDR'] - это будет айпи клиента (если у него выделенный), прокси(если он через прокси), нат сервера (если за натом)
$_SERVER['HTTP_CLIENT_IP'] - локальный айпи клиента за прокси(если прокси не анонимный) или натом. или реальный, если такой
HTTP_X_FORWARDED_FOR - локальный айпи за прокси, если прокси не анонимный.
обращаю внимание, что последние две директивы недокументированы
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 писался еще. но суть тут видна чуть более, чем полностью
А в этом моменте как поступить?
Да это я такой продукт уже на руки получил. За свои кровные :)
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];
}
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];
}
Если "по нормальному", то работать не хочет. Отписал в личку.