Advertisement
tolikpunkoff

user_ip_and_geoposition_for_program_analyse

Mar 27th, 2016
584
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 6.55 KB | None | 0 0
  1. <?php
  2. //Переделано из примера [8^12] v 0.6
  3. //Область заголовков
  4. header('Content-type: text/plain; charset=utf8');
  5. //Область подключения внешних скриптов
  6. include("SxGeo.php"); // Подключаем SxGeo.php класс
  7. // --------- Область глобальных переменных ---------
  8.  
  9. // Создаем объект
  10. // Первый параметр - имя файла с базой (используется оригинальная бинарная база SxGeo.dat)
  11. // Второй параметр - режим работы:
  12. //     SXGEO_FILE   (работа с файлом базы, режим по умолчанию);
  13. //     SXGEO_BATCH (пакетная обработка, увеличивает скорость при обработке множества IP за раз)
  14. //     SXGEO_MEMORY (кэширование БД в памяти, еще увеличивает скорость пакетной обработки, но требует больше памяти)
  15. $SxGeo = new SxGeo('SxGeoCity.dat');
  16. //$SxGeo = new SxGeo('SxGeoCity.dat', SXGEO_BATCH | SXGEO_MEMORY); // Самый производительный режим, если нужно обработать много IP за раз
  17.  
  18. //регулярное выражение для IP
  19. $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]?)#";
  20.  
  21. // --------- Конец области глобальных переменных ---------
  22.  
  23. // --------- Область функций ---------
  24.  
  25. function isip($ip_str) //соответствие данных формату IP
  26. {  
  27.     global $ip_pattern;
  28.     $ret=FALSE;
  29.     if (preg_match($ip_pattern,$ip_str))
  30.     {
  31.         $ret=TRUE;
  32.     }
  33.     return $ret;
  34. }
  35.  
  36. function chkdiapip ($user_ip, $ip_from, $ip_to) //попадает ли ip в нужный диапазон
  37. {
  38.     return ( ip2long($user_ip)>=ip2long($ip_from) && ip2long($user_ip)<=ip2long($ip_to) );
  39. }
  40.  
  41. function get_spec_diap ($user_ip) //определение, попал ли IP в специальный диапазон
  42. {
  43.     $ret=1;
  44.     //Частные IP
  45.     if (chkdiapip ($user_ip,'10.0.0.0','10.255.255.255'))
  46.     {
  47.         $ret="WRN_IP_PRIVATE_ADDRESS 10.0.0.0-10.255.255.255";
  48.         return $ret;
  49.     }
  50.     if (chkdiapip ($user_ip,'172.16.0.0','172.31.255.255'))
  51.     {
  52.         $ret="WRN_IP_PRIVATE_ADDRESS 172.16.0.0-172.31.255.255";
  53.         return $ret;
  54.     }
  55.     if (chkdiapip ($user_ip,'192.168.0.0','192.168.255.255'))
  56.     {
  57.         $ret="WRN_IP_PRIVATE_ADDRESS 192.168.0.0-192.168.255.255";
  58.         return $ret;
  59.     }
  60.     //Wrong IP
  61.     if (chkdiapip ($user_ip,'0.0.0.0','0.255.255.255'))
  62.     {
  63.         $ret="WRN_IP_WRONG_ADDRESS 0.0.0.0-0.255.255.255" ;
  64.         return $ret;
  65.     }
  66.     //IP  LOOPBACK
  67.     if (chkdiapip ($user_ip,'127.0.0.0','127.255.255.255'))
  68.     {
  69.         $ret="WRN_IP_LOOPBACK_ADDRESS 127.0.0.0-127.255.255.255";
  70.         return $ret;
  71.     }
  72.  
  73.     return $ret;
  74. }
  75.  
  76. function get_all_info_ip() //получаем информацию о всех IP, из всех переменных HTTP_* сервера
  77. {  
  78.     global $ip_pattern;
  79.     $ret="";
  80.     foreach ($_SERVER as $k => $v)
  81.     {
  82.         //если нашли в поле HTTP_* (HTTP_VIA, HTTP_X_FORWARDED_FOR и т.д.)
  83.         //что-то похожее на IP
  84.         if ((substr($k,0,5)=="HTTP_") AND (preg_match($ip_pattern,$v)))
  85.         {
  86.             preg_match_all($ip_pattern,$v,$matches); //вытаскиваем из строки все совпадения с шаблоном IP         
  87.             foreach ($matches as $tmp) //preg_match_all выдает многомерный массив
  88.             {
  89.                 foreach($tmp as $ip) //вытаскиваем каждый отдельный IP
  90.                 {
  91.                     $ret.=get_info_ip($k,$ip)."\n"; //получаем информацию для каждого IP
  92.                 }                              
  93.             }
  94.         }      
  95.     }
  96.     return $ret;
  97. }
  98.  
  99. function get_info_ip($field, $ip)
  100. {  
  101.     global $SxGeo;
  102.     $retv=""; //возвращаемое значение
  103.        
  104.     // проверка на соответствие формату
  105.     if (!isip($ip))
  106.     {
  107.         //не IP - записали в поле MESSAGE сообщение об ошибке и прекратили работу
  108.         $retv=$field."|0.0.0.0|ERROR_NOT_IP|0|0|0|0|0|0|0|0|0|";
  109.         return $retv;  
  110.     }
  111.  
  112.     //проверяем, не попал ли IP в особый диапазон
  113.     $check_diap = get_spec_diap($ip);
  114.     if ($check_diap!=1)
  115.     {
  116.         $retv=$field."|".$ip."|".$check_diap."|0|0|0|0|0|0|0|0|0|";
  117.         return $retv;
  118.     }
  119.  
  120.     $add_info = $SxGeo->getCityFull($ip); // Вся информация о городе
  121.     $main_info = $SxGeo->get($ip);         // Краткая информация о городе или код страны (если используется база SxGeo Country)
  122.  
  123.     //"FIELD|IP|MESSAGE|ISO_CODE|COUNTRY_NAME|CTNR_LAT|CTNR_LON|REGION_ISO|REGION_NAME|CITY_NAME|CTY_LAT|CTY_LON|\n";
  124.     $retv=$field."|".$ip."|OK|".$main_info['country']['iso']."|".$add_info['country']['name_en']."|".
  125.         $add_info['country']['lat']."|".$add_info['country']['lon']."|".
  126.         $add_info['region']['iso']."|".$add_info['region']['name_en']."|".
  127.         $main_info['city']['name_en'].'|'.$main_info['city']['lat']."|".$main_info['city']['lon'].'|';
  128.  
  129.     return $retv;
  130. }
  131.  
  132. function print_data_structure()
  133. {
  134.     echo "FIELD=Поле с данными об IP\n";
  135.     echo "IP=IP-адрес\n";
  136.     echo "MESSAGE=Сообщение об ошибке\n";
  137.     echo "ISO_CODE=Код страны (ISO)\n";
  138.     echo "COUNTRY_NAME=Страна\n";
  139.     echo "CTNR_LAT=Широта страны\n";
  140.     echo "CTNR_LON=Долгота страны\n";
  141.     echo "REGION_ISO=Код региона (ISO)\n";
  142.     echo "REGION_NAME=Регион\n";
  143.     echo "CITY_NAME=Город\n";
  144.     echo "CTY_LAT=Широта города\n";
  145.     echo "CTY_LON=Долгота города\n";
  146. }
  147. // ---------Конец области функций ---------
  148.  
  149. $ip="";
  150.  
  151. if (isset($_GET['ds'])) //запрос структуры данных
  152. {
  153.     print_data_structure();
  154.     die();
  155. }
  156.  
  157. echo "FIELD|IP|MESSAGE|ISO_CODE|COUNTRY_NAME|CTNR_LAT|CTNR_LON|REGION_ISO|REGION_NAME|CITY_NAME|CTY_LAT|CTY_LON|\n";
  158. echo '---START-MAIN-DATA---'."\n";
  159. //проверка наличия переменной, если она есть
  160. //проверяем не тот IP с которого зашли а переданный
  161. if (isset($_GET['ip']))
  162. {
  163.     $ip=$_GET['ip'];
  164.     echo get_info_ip("MANUAL",$ip)."\n";
  165.     echo '---END-MAIN-DATA---'."\n";
  166.     die();
  167. }
  168.  
  169. $ip = $_SERVER['REMOTE_ADDR'];
  170. echo get_info_ip("REMOTE_ADDR",$ip)."\n";
  171. echo '---END-MAIN-DATA---'."\n";
  172.  
  173. echo '---START-ADD-DATA---'."\n";
  174. $ip=get_all_info_ip();
  175. echo $ip;
  176. echo '---END-ADD-DATA---'."\n";
  177. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement