Определение IP и местоположения посетителя сайта 3.

Вот анон задает справедливый вопрос, до которого из парней догадался лишь умник-Ильюша, четырнадцатилетний переросток из Харькова. Из девок — никто.
Итак.
Q: Что будет, если нашему скрипту подсунуть валидный ip, но не с какой точки зрения смысла не имеющие: адреса частных сетей, адреса для «обратной петли» (LOOPBACK)
A: Будет нечто некрасивое: в геобазе закономерно нет частных ip, коих одинаковых миллионы на Земле, но вообще разработчики, конечно, недоработали. Надо штатный ответ на такой запрос.
Т.е. если просто передать частный IP геобазе, то она выдаст что-то типа такого:


Некрасиво и неправильно.

Так как же этого избежать, известить клиента о такой ситуации?
Известно, что в IANA определены группы адресов для LOOPBACK’а и локальных сетей: см. хотя-бы Википедию, а также известно, что нельзя использовать диапазон IP 0.0.0.0 - 0.255.255.255, заодно это закрыло дырку в регулярном выражении (пропускались конструкции вида 1.1.1.1.1). Надо было бы подправить регулярку, но мне влом, кто хочет — помогите и подправьте. Дам я вам за это ничерта, спасибо скажу только лишь.
Регулярка для валидации IP:

$ip_pattern="#(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)#";


Итак. Добавляем функцию, проверяющую, попал ли IP в диапазон:

function chkdiapip ($user_ip, $ip_from, $ip_to) //попадает ли ip в нужный диапазон
{
return ( ip2long($user_ip)>=ip2long($ip_from) && ip2long($user_ip)<=ip2long($ip_to) );
}


И функцию, которая последовательно проверяет не попал ли наш IP в один из диапазонов:

function get_spec_diap ($user_ip) //определение, попал ли IP в специальный диапазон
{
$ret=1;
//Частные IP
if (chkdiapip ($user_ip,'10.0.0.0','10.255.255.255'))
{
$ret="WRN|IP PRIVATE ADDRESS 10.0.0.0-10.255.255.255";
return $ret;
}
if (chkdiapip ($user_ip,'172.16.0.0','172.31.255.255'))
{
$ret="WRN|IP PRIVATE ADDRESS 172.16.0.0-172.31.255.255";
return $ret;
}
if (chkdiapip ($user_ip,'192.168.0.0','192.168.255.255'))
{
$ret="WRN|IP PRIVATE ADDRESS 192.168.0.0-192.168.255.255";
return $ret;
}
//Wrong IP
if (chkdiapip ($user_ip,'0.0.0.0','0.255.255.255'))
{
$ret="WRN|IP WRONG ADDRESS 0.0.0.0-0.255.255.255" ;
return $ret;
}
//IP  LOOPBACK
if (chkdiapip ($user_ip,'127.0.0.0','127.255.255.255'))
{
$ret="WRN|IP LOOPBACK ADDRESS 127.0.0.0-127.255.255.255";
return $ret;
}
return $ret;
}


Если IP попал в один из диапазонов - функция возвращает строку с идентификатором события WRN (Внимание, некритичная ошибка или ситуация) и описанием, если IP не попадает ни в один диапазон, то функция возвращает 1.
Перед тем, как создавать объект, вставляем очередную проверку:

//проверяем, не попал ли IP в особый диапазон
$check_diap = get_spec_diap($ip);
if ($check_diap!=1)
{
echo "IP|".$ip."n";
echo $check_diap;
die();
}


Если попал - выводим сообщение и прерываем скрипт командой die();
Далее делаем, как в сериях 2 и 1, т.е. создаем объект SxGeo, обращаемся к нему и выводим данные в удобном виде.
Скачать можно здесь, посмотреть как работает тут. В качестве аргумента GET вставлен адрес из LOOPBACK-диапазона.


IP из частного диапазона.

Предыдущая серия Продолжение

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/269169.html
Прокомментировать заметку можно по ссылке выше.

ISO-коды стран

В формате CSV, только двухбуквенные, разделитель «;»:
Afghanistan;AF
Aland Islands;AX
и т.д.
Качать здесь

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/268848.html
Прокомментировать заметку можно по ссылке выше.

Определение IP и местоположения посетителя сайта 2.

Мне сегодня в почту поступило довольно закономерных вопросов от моих читателей.
Итак, отвечаю
Q: Как модифицировать скрипт, чтоб можно было проверить любой IP, который захочется задать?
A:
Очень просто. Достаточно передать скрипту нужный IP (здесь я сделаю это с помощью метода GET)Сначала модифицируем скрипт таким образом:
После
// Подключаем SxGeo.php класс
include("SxGeo.php");

Вставляем код проверки наличия соответствующей переменной GET пусть у нас она будет ip

//проверка наличия переменной
if (!isset($_GET['ip']))
{
echo 'ERROR|NOT DATA';   //не нашли - вывели сообщение об ошибке и прекратили работу
die();
}


Далее, нам потребуется проверить IP на валидность, мало ли что нам в GET сунули.
Я обычно организую вначале файла «Область функций», хотя с точки зрения PHP это необязательно, но мне так удобно.
После
//Область заголовков
header('Content-type: text/plain; charset=utf8');

Добавляю функцию проверки IP на валидность

// ---------Область функций ---------
function isip($ip_str) //проверка соответствия данных формату IP
{
$ip_pattern="#(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)#";
$ret=FALSE;
if (preg_match($ip_pattern,$ip_str))
{
$ret=TRUE;
}
return $ret;
}
// ---------Конец области функций ---------


Далее, после проверки наличия переменной, вставляем проверку на валидность IP

$ip=$_GET['ip'];
// проверка на соответствие формату
if (!isip($ip))
{
echo 'ERROR|NOT IP';   //не IP - вывели сообщение об ошибке и прекратили работу
die();
}


Далее, все как в предыдущей серии. Создаем объект SxGeo и скармливаем ему айпишник, да выводим данные в удобной форме.
Скачать можно здесь, Посмотреть как работает — здесь. Для примера в ссылку вставлен IP прокси анончика из комментария к предыдущей заметке.


тот самый анончик, точнее его прокси

реакция на попытку передать ерунду

или передать ничего

Начало Продолжение

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/268782.html
Прокомментировать заметку можно по ссылке выше.

Три неологизма

Мирный: Транк(и)-Вылезатор(ы)
И военный: Танк(и)-Вылезатор(ы) — это танк, который вылезает из-за границы соседнего государства.
Еще один военный неологизм: Танк(и)-Вылизатор(ы) — которые туда заехали, и там сгорели при нападении на территорию соседнего государства. Вылизали у Правого Сектора.

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/268456.html
Прокомментировать заметку можно по ссылке выше.

Фразочка

Ну и байка о ее появлении, заодно:
Идет экзамен по странному и ненужному предмету «История Информатики и ВТ», сдает студент, который ессно, нихрена не знает:
Препод: «Ладно, ответите на вопрос, поставлю вам 3. Вопрос очень простой. Как звали первую известную в истории женщину программистку»?
Студент: «Ада, Ада точно. В ее честь язык программирования назвали…»
Препод: «Ну а фамилия»?
Студент (пыхтя минут 5 и напряженно думая): «О! Легалайз! Точно! Ада Легалайз!»
Занавес.
ЗЫ. Когда-то давно рассказал Панкарь, на моем курсе не повторялось.

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/267324.html
Прокомментировать заметку можно по ссылке выше.

Определение 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
Продолжение

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/267126.html
Прокомментировать заметку можно по ссылке выше.

Раз уж вспомнили про говно, а народу интересно.

Даю анонс. Ждите новой информации про Семенова Сергея Сергеевича, депутата, а также его (надеюсь просто куратора, а не любовника, г-н(аря) Гостева) потому что если Семенов все-таки не просто курируемый, то у меня он будет вызывать рвоту. Потому что вкуса, стиля нет. И неразборчив в выборе партнеров.

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/266961.html
Прокомментировать заметку можно по ссылке выше.

Отрицательные персонажи для комикса про Гаджубасмена.

Когда-то в детстве такой сочиняли, но так и не сделали, а сегодня оттуда приснились два персонажа: Гос Нарко Кон, тролль и его друг, он же ездовое животное Конь Фискат — второй выглядит как поджарый жеребец с вечно стоящей от амфа …. антенной триколор-тв между ног, и постоянно выпученными глазами. А Гос Н.К. похож на толстого зеленого дезоморфинового наркомана в последней стадии пиздецомы, но он не дохнет, и сзади у него крокодилий хвост.
Постоянно ходит в паб города Енотослав, где так и представляется, на манер или Бонда, или просто чела, решившего сверкнуть своей должностью:
— Меня зовут Лена, а тебя как?
— Гос Нарко Кон, тролль. Хотя можешь звать меня просто Госом.
А когда они нажираются, то садятся на Коня Фиската (который постоянно забывает в баре кредитку и пальто), быстро через Внепространство и Вселенскую Пустоту в постель 🙂
Нарисуйте Г.Н. Кон, тролля и коня его Фиската, мож и комикс сделаем.
Можно прямо в комменты постить.

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/266381.html
Прокомментировать заметку можно по ссылке выше.

Продолжая тему…

когда вдруг спросит подполковник
кого имел под буквой х
то я отвечу просто смело
конечно же це хомени

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/266220.html
Прокомментировать заметку можно по ссылке выше.

Таки дыбровый дневник

Завел все-таки, кому надо — вот он [info]blu4sezon@ljr

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/265880.html
Прокомментировать заметку можно по ссылке выше.

пирожок про Хуйло

зачем товарищ подполковник
вы мне пришили экстремизм
я президента уважаю
пишу его с заглавной х

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/265495.html
Прокомментировать заметку можно по ссылке выше.

О «тьме миров»

Выражение, которое мы с друзьями последние годы использовали как оберег (Что это зашуршало? Да будет с ним тьма миров), либо как объяснение какой-то непонятной хуйни или того, что будет после смерти.
А сегодня я понял — наша «тьма миров» синоним термина «темная энергия». С помощью темной энергии можно получить прямой доступ к пространству высшей мерности. Темная энергия — наиболее тонкая часть, отделяющая нас от прямых межмировых рейсов.

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/265035.html
Прокомментировать заметку можно по ссылке выше.

Боюсь представить размер

Мастерская Зураба Церетели проектирует для Москвы «бронзового таджика»

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/264896.html
Прокомментировать заметку можно по ссылке выше.

Среднестатистический полицейский протокол 2016 г.

Л. и В. сидели у Л. дома в 00.57, пили французский коньяк из канистры, закусывали мидиями из тазика, и делали кое что заперщенное российским законом (лайкали посты в группах Правого Сектора под песни группы Машина Времени)

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/264454.html
Прокомментировать заметку можно по ссылке выше.

про «Спойлер и Прокорм»

Бля, зашел на сайт просвиньина и сблеванул. Не от текста, а от дизайна — когда под заголовком и аннотацией статьи всплывает уебищная картинка на которой нихуя не прочитать текст, причем картинка имеющая отношение не только к статье, но (прошу особо заметить!) и к упоротому мозгу редактора, или хто у их там за ту хуйню ответственный, при прокручивании вообще какой-то триповый эффект с напрягающими всплывающими и мигающими картинками.
Дизайн (особенно в данном случае) прекрасно передает суть сайта. Так что дизайнера наградить! После чего отрезать руки по самую жопу.

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/264304.html
Прокомментировать заметку можно по ссылке выше.

Из ненаписанных романов. Навеяно предыдущим.

Кот Шредингера обожал лежать на пятимерной подушке, попивая пивко из бутылки Клейна. А напившись он тессерактом пытается заткнуть вход в нору 4.[frac(pi())] ==4.дробнаячастьатчеслапи — мерной мыши.

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/264019.html
Прокомментировать заметку можно по ссылке выше.

Хаогностическое белье начали выпускать в Пятигорске!


Прислали прикольное. Не, я понимаю вещи в 3D (они и так все 3D — ширина, высота, длина), но вот в пятимерное постельное белье я бы не рекомендовал никому, кроме принявших Хаогнозис, заворачиваться. Мало ли в Варп провалитесь…

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/263688.html
Прокомментировать заметку можно по ссылке выше.