Толик Панков
hex_laden
............ .................. ................

November 2020
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

Толик Панков [userpic]
Определение IP и местоположения посетителя сайта.

В сети по этому поводу довольно много материала, но я расскажу как это сделал я.
Понадобилось мне написать серверный back-end к одной программе (о ней я при случае расскажу позже), определающей ip клинта и его местоположение.
Задачи определить, сидит ли клиент через неанонимный прокси не было. Если кого-то интересует этот момент, рекомендую статью [Скачать PDF]

Итак, для определения IP нам понадобится собственно IP клиента, который нам обычно любезно предоставляет сервер в переменной $_SERVER['REMOTE_ADDR'] (о других случаях где можно если нужно искать IP - смотрите вышеуказанную статью).

Теперь о б определении местоположения по IP. Для сего действия необходима база геолокации (база, где сопоставлены диапазоны IP и страны, опционально города). Такие базы бывают платные/бесплатные, автономные (можно унести себе на сайт) и не автономные (сидят у кого-нибудь на сервере и выдают информацию по запросу) и т.д.

Для моей задачи нужна была автономная и бесплатная БД. Я воспользовался SxGeo: статья о ней на Хабре, Еще одна и сайт проекта.

Там все довольно просто. Скачиваем нужные базы, скрипт, который ими управляет, ставим на сайт. В комплекте есть небольшой пример.
Чтобы не тыкать по ссылкам, я собрал все в один архив, который можно скачать здесь

А теперь скрипт. Моя задача была небольшая, потому мне хватило просто изменить скрипт примера:

// Переделано из примера [8^12]
header('Content-type: text/plain; charset=utf8');

// Подключаем SxGeo.php класс
include("SxGeo.php");
// Создаем объект
// Первый параметр - имя файла с базой (используется оригинальная бинарная база SxGeo.dat)
// Второй параметр - режим работы:
// SXGEO_FILE (работа с файлом базы, режим по умолчанию);
// SXGEO_BATCH (пакетная обработка, увеличивает скорость при обработке множества IP за раз)
// SXGEO_MEMORY (кэширование БД в памяти, еще увеличивает скорость пакетной обработки, но требует больше памяти)
$SxGeo = new SxGeo('SxGeoCity.dat');
//$SxGeo = new SxGeo('SxGeoCity.dat', SXGEO_BATCH | SXGEO_MEMORY); // Самый производительный режим, если нужно обработать много IP за раз


1. Выдаем нужный заголовок, подключаем основной скрипт SxGeo.php
2. $ip = $_SERVER['REMOTE_ADDR']; - получаем IP клиента, и записываем информацию в переменную $ip
3. $add_info = $SxGeo->getCityFull($ip); // Вся информация о городе
$main_info = $SxGeo->get($ip); // Краткая информация о городе или код страны (если используется база SxGeo Country)
- передаем IP объекту SxGeo, записываем всю полученную информацию в переменные $main_info и $add_info (соответственно, основную и дополнительную информацию)
3. Выводим данные в удобном для дальнейшей обработки виде:
echo "IP|".$ip."\n";

echo "ISO_CODE|".$main_info['country']['iso']."\n";

echo "CITY|".$main_info['city']['name_en'].'|'.
$main_info['city']['lat'].'|'.
$main_info['city']['lon']."\n";

echo "COUNTRY_INFO|".$add_info['country']['name_en'].'|'.
$add_info['country']['lat'].'|'.
$add_info['country']['lon']."\n";

echo "REGION_INFO|".$add_info['region']['iso'].'|'.
$add_info['region']['name_en']."\n";


Посмотреть, как работает скрипт, можно на HexProject, скачать его здесь, а пакет из необходимых баз, скрипта API SxGeo и вышеуказанного скрипта здесь


У меня сегодня, например, голландский IP
Продолжение

Tags: , ,
Comments

о, мерси!
про SypexGeo-то я и не знал, пригодится.

единственно, пхп надо будет переписать, но там тащемта всё ясно.

Все ссылки почитайте, первую обязательно. Особенно, если надо прокси определять. В _X_ заголовки иногда ТАКОЕ суют, что я сам охуел. Тестовый сервак (Хаоссофтовский) их под настроение вообще режет или пишет туда погоду на марсе.

мерси, я тащемта в курсе, пару раз пришлось вникать.
мне нужно для SIEM, ип идут из логов оборудования, им можно доверять насколько вообще можно доверять TCP.

Ясно. Я уж понял, что вы разбираетесь (и наверняка лучше меня), но я ж пишу в основном для студентов, которым такие маны нужны - скачал, распаковал, тыкнул, получилось. И еще шоб понятно, как оно вообще работает. Так что благодарю за отзыв, а в последующем - приветствуется конструктивная критика.

(Anonymous)

> определающей ip клинта и его местоположение.
> CITY|Saint Petersburg|59.93863|30.31413
определяет ок, ошибка меньше 300 км, продолжайте

У мобильных провайдеров оно бывает, да. Я когда жил в рашке, однажды выходил с теледвашной карельской симки в СПб и тоже был идентифицирован, как "Карелия, Петрозаводск" так что вы можете находиться на некотором растоянии от того, что сайт говорит, но дела это особо не меняет. Я вообще из вей информации буду использовать страну, остальное юзеру показывать как справку.

Говорю ж - это простенький серверный бэкэнд. А вместо пиздежа, прикрутили бы скриптик анализа возможных прокси. А то пиздеть в комментах и айвэфоревер может.

и вообще - заказчика интересует точность до страны. остальное - просто справочная информация (в 1 версии).

Ах, да. Геопозиция по IP основана на SxGeo -все ссылки в посте есть. В т.чю и на оф. сайт.