Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [skrypt] Geolokalizacja adresów IP
Forum PHP.pl > Inne > Oceny
Bastion
Napisalem skrypt korzystajacy z bazy danych openGeo ( http://opengeo.niwidu.org/ ) . Dodalem do niej wlasne rekordy informacyjne takie jak gmina , i lokalizacje na mapie Polski. W chwili obecnej rozpoznowane jest 18000 adresow IP. Chetnych zaprazam pod ten adres http://www.dna.ltd.pl/ScoutX/ w celu sprawdzenia czy dziala. Apeluje takze o rejestracje na http://opengeo.niwidu.org/ w przypadku jesli twoj adres IP nie zostal wykryty. Baza openGeo posiada obecnie zarejestrowanych 22000 adresow. Zrdodla jak i przerobiona baze danych udostepnie juz wkrotce.
Vertical
Cytat
Wystąpił błąd podczas ładowania http://opengeo.niwidu.org/:


Nieznany serwer opengeo.niwidu.org
Bastion
coś im chyba padło smile.gif ale http://www.dna.ltd.pl/ScoutX/ działa
Vertical
Działa, ale wysypuje:
Cytat
SZUKAM: 1394282486 / 83.27.15.246
nie znalazlem... zrejestruj swoj adres : http://opengeo.niwidu.org/

A http://opengeo.niwidu.org/ już nie działa
Bastion
pewnie jakis problem techniczny sad.gif
Kinool
hmm mi wyskoczylo ze adres jest w zablokowan puli czy cos takiego smile.gif nie wiem o co chodzi smile.gif

pozdrawiam
Bastion
z tego co wiem baza opengeo odrzuca adresy IP jak modemy, badz uslugi Neo+ ktore moga zmieniac geolokalizacje. Na przyklad chyba neo+ przy kazdym laczeniu sie z internetem korzysta z innego adresu
ip. stad tez nie moznosc uzycia takiego adresu do stalel geolokalizacji
rogrog
dobry - mnie zlokalizował elegancko i pokazał na mapce w okolicach Gdańska a wiec ok
Vertical
Teraz już działa... ale z kolei:
Cytat
Ten adres IP należy do zablokowanej puli adresowej

Właściwie to nie wiem dlaczego, bo adresy neo+ zaczynające się od 83.27.*.* zawsze pochodzą z Wrocławia, więc nie powinno być problemu...
Puciek
Idealnie wskazalo mojego dostawce biggrin.gif
Moglo by jeszcze wskazywac ulice, nr domu, pesel i rozmiar spodni oraz typ fryzury tongue.gif
Bastion
Niestety jestem ograniczony tylko do nazwy wojewodztwa, nazwy miejscowosci i powiatu.
Ja dodalem od siebie wspolrzedne geograficzne i gmine ( chociaz nie wiem czy gmina pojawi
sie w koncowej bazie danych )

Vertical, posiadam informacje ze to sie podobno ma zmienic i bedzie mozna rejestrowac
zakazane pule
Bakus
To ja może dorzucę coś od siebie...

http://dev.idn.net.pl/dns.php

Kod
Info dla: 83.27.6.1
Array
(
    [inetnum] => 83.27.0.0 - 83.27.127.255
    [netname] => NEOSTRADA-ADSL
    [descr] => Neostrada Plus Wroclaw
    [country] => PL
)


  1. <pre>
  2. <?php
  3. $target = $_SERVER[&#092;"REMOTE_ADDR\"];
  4. $server = &#092;"whois.ripe.net\";
  5. print &#092;"<b>Info dla:</b> \" . $target . \"<br />\";
  6. $target = gethostbyname($target);
  7. if (! $sock = fsockopen($server, 43, $num, $error, 20))
  8. {
  9. unset($sock);
  10. $msg .= &#092;"Timed-out connecting to $server (port 43)\";
  11. }else{
  12. fputs($sock, &#092;"$targetn\");
  13. while (!feof($sock))
  14. {
  15. $buffer .= fgets($sock, 10240); 
  16. }
  17. fclose($sock);
  18. }
  19. $buffer = explode(&#092;"n\", $buffer);
  20. foreach($buffer as $line)
  21. {
  22. $line = preg_replace('/s+/', ' ', $line);
  23. $line = explode(&#092;":\", $line);
  24. $line[1] = trim($line[1]);
  25. if($line[0] == &#092;"inetnum\" || $line[0] == \"netname\" || $line[0] == \"descr\" || $line[0] == \"country\")
  26. {
  27. if(empty($data[$line[0]]))
  28. {
  29. $data[$line[0]] = $line[1];
  30. }else{
  31. $data[$line[0]] .= &#092;" \" . $line[1];
  32. }
  33. }
  34. if($line[0] == &#092;"country\")
  35. {
  36. break;
  37. }
  38. }
  39. print_r($data);
  40. ?>
  41. </pre>
Bastion
Drobny update i kolejny preview.

http://www.dna.ltd.pl/ScoutX/
Vertical
Nowe mapy są bardzo ładne, zwłaszcza ten gradient na mapie administracyjnej
Bastion
dodalem na szybko detekcje systemu i przegladarki. jak myslicie dane statystyk przechowywac w pliku czy cisnąć je do sqla?
crash
Świetne poprawki. Zwłaszcza wykrywanie mojego IP z Lanu biggrin.gif Teraz to już na pewno nie znajde się na tej mapce...
Bastion
Crashu smile.gif a teraz?
crash
Dalej to samo, ale tak czy inaczej nie wykrywało mojego IP mimo, że istnieje już w Twojej bazie od paru dni...
Bastion
aaaaaaaaa, crashu jesli rejestrowales IP po 1 lutym to nowa uaktualniona baza danych zawierajaca twoj
ip bedzie dopiero 1 marca jak ludzie z openGeo wygeneruja nowa baze. co do ip znalazlem blad sprawdzilem na wszystkie mozliwe sposoby i powinno byc ok
crash
No nie jest. Sprawdzasz REMOTE_ADDR?
Bastion
  1. <?
  2.  
  3. if ($_SERVER[&#092;"HTTP_X_FORWARDED_FOR\"])
  4. {
  5. if ($_SERVER[&#092;"HTTP_CLIENT_IP\"])
  6. {
  7. $proxy = $_SERVER[&#092;"HTTP_CLIENT_IP\"];
  8. } else
  9. {
  10. $proxy = $_SERVER[&#092;"REMOTE_ADDR\"];
  11. }
  12.  
  13. $ip = $_SERVER[&#092;"HTTP_X_FORWARDED_FOR\"];
  14. } else
  15. {
  16. if ($_SERVER[&#092;"HTTP_CLIENT_IP\"])
  17. {
  18. $ip = $_SERVER[&#092;"HTTP_CLIENT_IP\"];
  19. } else
  20. {
  21. $ip = $_SERVER[&#092;"REMOTE_ADDR\"];
  22. }
  23. }
  24.  
  25. $tip = str_replace(&#092;" \",\"\",split(\",\",$ip));
  26.  
  27. if ($tip>2)
  28. {
  29. $ip = array_pop($tip);
  30. }
  31.  
  32. if (substr($ip,0,4)==&#092;"192.\" && isset($proxy))
  33. {
  34. $ip = $proxy;
  35. }
  36.  
  37. ?>


Szczerze przyznam sie ze nie wiem dlaczego lapie twoj adres z LAN sadsmiley02.gif
Sam mam lokalny IP i wykrywa moj IP jako adres serwera, bawillem sie nawet prostym
spoofingiem i test tez przeszedl pomyslnie .... hm.... co jest nie tak?
crash
Ja wiem dlaczego. Moja sieć jedzie na klasie adresów z początkiem 10.x, a ty sprawdzasz tylko 192.
kszychu
Panowie, ja jak zwykle w kwestii formalnej:
Do jasnej ch.....y! Od gadek typu "u mnie nie działa", "a zobacz teraz", "teraz też nie" jest irc!
Skupmy się tutaj na ocenie stron a nie na jej poprawianiu!
Bo zamknę.... ;-)
Bastion
@kszychu : racja, przepraszam. ale w sumie dzieki temu zlokalizowalem kolejne niedaciagniecie jakim bylo nie sprawdzenie wszystkich lokalnych klas IP. ale generalnie masz racje smile.gif od razu moglem pokazac fragment php odpowiedzialny za detekcje IP. Przepraszam. Az boje sie teraz zamiescic poprawiony fragemnt php smile.gif do
dalszej dyskusji
crash
Hihi smile.gif Ja tylko zgłosiłem błąd jak to przy ocenie wypada zrobić, bo takie pokazanie błędu przecież ma wpływ na ocenę, a że się rozgadaliśmy to już przypadek. Już się poprawiam...


Pssyt... Bastion: dalej nie działa snitch.gif
Bastion
Crashu wskaz mi co tu wprowadza blad sad.gif bo juz glupieje z tym ;]

  1. <?
  2.  
  3. $private_net_ip_masks = array( '10.0.0.', '192.168.', '127.0.0.', '172.16.0.' );
  4.  
  5. if ($_SERVER[&#092;"HTTP_X_FORWARDED_FOR\"])
  6. {
  7. if ($_SERVER[&#092;"HTTP_CLIENT_IP\"])
  8. {
  9. $proxy = $_SERVER[&#092;"HTTP_CLIENT_IP\"];
  10. } else
  11. {
  12. $proxy = $_SERVER[&#092;"REMOTE_ADDR\"];
  13. }
  14.  
  15. $ip = $_SERVER[&#092;"HTTP_X_FORWARDED_FOR\"];
  16. } else
  17. {
  18. if ($_SERVER[&#092;"HTTP_CLIENT_IP\"])
  19. {
  20. $ip = $_SERVER[&#092;"HTTP_CLIENT_IP\"];
  21. } else
  22. {
  23. $ip = $_SERVER[&#092;"REMOTE_ADDR\"];
  24. }
  25. }
  26.  
  27. $tip = str_replace(&#092;" \",\"\",split(\",\",$ip));
  28.  
  29. if ($tip>2)
  30. {
  31. $ip = array_pop($tip);
  32. }
  33.  
  34. foreach($private_net_ip_masks as $k => $pip)
  35. {
  36. if(strpos($ip, $pip) === 0)
  37. {
  38. $ip = $proxy; break;
  39. }
  40. }
  41.  
  42.  
  43. ?>
dr_bonzo
http://www.iana.org/faqs/abuse-faq.htm
Cytat
"Private Use" IP addresses:
        10.0.0.0 - 10.255.255.255 ---> 10.0.0.0/8
        172.16.0.0 - 172.31.255.255 ---> 172.16.0.0/12
        192.168.0.0 - 192.168.255.255 ---> 192.168.0.0/16
crash
Bastion: sprawdzaj tylko najstarszy bajt adresu.
  1. <?php
  2. if(preg_match('#^(10|192|172).#', $ip))
  3. {
  4.  // adres lokalny
  5. }
  6. ?>
Bastion
AAAa takie buty smile.gif

@dr_bonzo : dzieki, o to chodzilo

@crsshu : chyba twoj sposob nie zadziala bo 192.169. juz nie jest adresem lokalnym.

Final :

  1. <?
  2.  
  3. function checkIPNet($ip,$net,$mask)
  4. {
  5. $lip = ip2long($ip);
  6. $lnet = ip2long($net);
  7. $str1 = substr(str_pad(decbin($lip),32,&#092;"0\",\"STR_PAD_LEFT\"),0,$mask);
  8. $str2 = substr(str_pad(decbin($lnet),32,&#092;"0\",\"STR_PAD_LEFT\"),0,$mask);
  9. return(strcmp($str2,$str1)==0);
  10. }
  11.  
  12. function isLocalAddress($ip)
  13. {
  14. $private = array(&#092;"127.0.0.0/8\",\"10.0.0.0/8\",\"172.16.0.0/12\",\"192.168.0.0/16\");
  15. foreach ( $private as $subnet )
  16. {
  17. list($net,$mask) = split(&#092;"/\",$subnet);
  18. if (checkIPNet($ip,$net,$mask))
  19. {
  20. return(true);
  21. }
  22. }
  23. return(false);
  24. }
  25.  
  26. if ($_SERVER[&#092;"HTTP_X_FORWARDED_FOR\"])
  27. {
  28. if ($_SERVER[&#092;"HTTP_CLIENT_IP\"])
  29. {
  30. $proxy = $_SERVER[&#092;"HTTP_CLIENT_IP\"];
  31. } else
  32. {
  33. $proxy = $_SERVER[&#092;"REMOTE_ADDR\"];
  34. }
  35. $ip = $_SERVER[&#092;"HTTP_X_FORWARDED_FOR\"];
  36. } else
  37. {
  38. if ($_SERVER[&#092;"HTTP_CLIENT_IP\"])
  39. {
  40. $ip = $_SERVER[&#092;"HTTP_CLIENT_IP\"];
  41. } else
  42. {
  43. $ip = $_SERVER[&#092;"REMOTE_ADDR\"];
  44. }
  45. }
  46.  
  47.  
  48. $tip = str_replace(&#092;" \",\"\",split(\",\",$ip));
  49.  
  50. if ($tip>2)
  51. {
  52. $ip = array_pop($tip);
  53. }
  54.  
  55. if (isLocalAddress($ip)) { $ip = $proxy; }
  56.  
  57. ?>
squid
napisalem sobie cos takiego:
http://celeron.valkyrie.one.pl/geo/examples/ex_hostinfo.php
to jest dostepne teraz za kilka dni moze tego nie byc albo nie dzialac.
To "cos" potrafi poprawnie rozpoznac kraj pochodzenia i czesto miasto (zwlaszcza jesli ktos kozytsa z chello albo neostrady).
Jesli ktos korzysta z serwera proxy takiego, ktory daje sie wykryc to tez powinno podac prawidlowy adres IP. Przetestujcie. Ciekaw jestem jak to dziala w praniu.
dr_bonzo
Ja bym wylaczyl mozliwosc skanowania portow -- jesli nie chcesz miec problemow w przypadku skanowania routerow/serwerow ISPow.

Zamiast miasta pokazalo mi nazwe firmy.
squid
Cytat(dr_bonzo @ 2006-01-04 22:47:52)
Ja bym wylaczyl mozliwosc skanowania portow -- jesli nie chcesz miec problemow w przypadku skanowania routerow/serwerow ISPow.

Zamiast miasta pokazalo mi nazwe firmy.

Jak juz mowilem ten adres jest chwilowo dostepny w celach edukacyjnych winksmiley.jpg
Skanowanie portow polega na nawiazaniu polaczenia wiec jesli ktos sie przed tym nie zabezpiecza znaczy ze nawet nie sprawdza logow serwera.

A z ta nazwa firmy to wiem tez tak mam :/
sztosz
@squid: Działa, co do miejscowości to się pomylił jedynie o jakieś 75 km (wałbrzych -> wrocław). Skanowanie portów też działa, bo mi outpost zaskrzeczał o ataku smile.gif Jak by mi jeszcze cały szajs od RIPE na żadanie pokazywał zamiast odrazu to by było fajniej winksmiley.jpg
squid
Cytat(sztosz @ 2006-01-04 22:52:47)
@squid: Działa, co do miejscowości to się pomylił jedynie o jakieś 75 km (wałbrzych -> wrocław). Skanowanie portów też działa, bo mi outpost zaskrzeczał o ataku smile.gif Jak by mi jeszcze cały szajs od RIPE na żadanie pokazywał zamiast odrazu to by było fajniej winksmiley.jpg

i tak dobrze smile.gif

ten szais to wyswietlam tak sam dla siebie zeby kontrolowac poprawnosc wynikow.
Moj system korzysta do lokalizacji z DNS, whois i bazy opengeo tyle ze w okrojenoej tu wersji ja widzicie (1000 rekordow) wiec stad te rozbierznosci.

EDIT: dodalem drobna modyfikacje w kodzie, teraz tam gdzie podawana byla nazwa firmy powinno byc miasto. Jest?
kowal1122
nie dziala, strona się nie otwiera mad.gif
dr_bonzo
Czytac, czytac, czytac
Cytat
to jest dostepne teraz za kilka dni moze tego nie byc albo nie dzialac.
...
Jak juz mowilem ten adres jest chwilowo dostepny w celach edukacyjnych
squid
adres, ktory podalem dziala (jeszcze). zniknie na pewno do konca miesiaca ale moze wczesniej jesli ktos sie bedzie skarzyl albo skrypt bedzie powodowal duze obciazenie serwera. Raczej juz tego nie bede rozwijal choc mozna sporo ulepszyc. Jesli cos sie zmieni to napisze. Puki adres moze sluzyc jako pokaz mozliwosci lokalizacji.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.