Ein überaus interessantes „Tool“ habe ich kürzlich im Web gefunden, nämlich hier.
Wie kann man anhand einer IP Adresse das Herkunftsland ermitteln? Mit der Beschreibung geht das denkbar einfach, man benötigt PHP und eine MySQL Datenbank. Und das ganze funktioniert so:
1) Importieren einer csv Datei, die von Webhosting.info zur Verfügung gestellt wird. Hierzu wird die Datei downgeloadet und entpackt, auf den Webserver-Bereich kopiert, die Datenbanktabelle eingerichtet (steht als Kommentar im Script!) und dann mit folgendem Script in die Datenbank importiert:
import.php
<?php /*CREATE TABLE `IPtoCountry` ( `IP_from` DOUBLE NOT NULL , `IP_to` DOUBLE NOT NULL , `zwei` CHAR( 2 ) NOT NULL , `drei` CHAR( 3 ) NOT NULL , `name` VARCHAR( 50 ) NOT NULL );*/ // -------------------------- // CSV-Datei öffnen $handle = fopen("ip-to-country.csv", "r"); // mySQL-Server verbinden mysql_connect("localhost", "user", "password"); mysql_select_db("Datenbankname"); // Schleife für jede Zeile der Datei durchlaufen while ($zeile = fgetcsv($handle, 1024, ',', '"')) { $sql = "INSERT INTO IPtoCountry VALUES('".$zeile[0]."', '".$zeile[1]."', '".$zeile[2]."', '".$zeile[3]."', '".$zeile[4]."');"; mysql_query($sql); } // CSV-Datei schließen fclose($handle); ?>
Nachdem der Import erfolgreich war, stehen 111.752 Sätze in dieser Datenbanktabelle – der erste Step ist geschafft!
2) Nun kann die Tabelle genutzt werden, das Herkunftsland anhand einer IP-Adresse zu bestimmen. Ich habe dazu den PHP Counter benutzt, den ich hier beschrieben habe. Dieser Counter speichert für einen Tag Besucher der Webseite und mit der Zuordnung zum Herkunftsland weiss ich dann, wer da zugegriffen hat (Anmerkung: Die Access-Logs des Apache Servers zeigen dies auch). Das ist nicht nur ein nettes Feature, es gibt auch triftige Gründe (z.B. Spambots!). Ich sage dazu mehr in einem anderen Artikel hier im Blog.
Ich habe die bereitgestellten PHP Scripte leicht verändert und meinen Bedürfnissen angepasst. Sie sehen so aus, zunächst die Funktion und Datei:
ip2country.php
<?php function IPtoCountry($IP) { $IP = sprintf("%u",IP2Long($IP)); // Connect to IP2Country Database ---- mysql_connect("localhost","user","password") or die(mysql_error()); mysql_select_db("Datenbankname") or die(mysql_error()); $result = mysql_query("SELECT * FROM IPtoCountry WHERE IP_from = $IP LIMIT 1")or die("".mysql_error().""); if(mysql_num_rows($result) == 0) { $land = "Unbekannt"; $code2 = "--"; $code3 = "---"; } else { $row = mysql_fetch_object($result)or die("".mysql_error().""); $land = $row->name; $code2 = $row->zwei; $code3 = $row->drei; } return array ($land, $code2, $code3); } ?>
Kleine Info zu dieser Funktion: Ich übergebe EINEN Parameter in die Funktion und bekomme DREI zurück, nämlich den gesamten Inhalt des Datenbanksatzes! Dieser kleine Trick bewerkstellige ich mit dem LIST-Kommando, siehe das demo.php Script, mit dem ich die Tabelle der gespeicherten Besucher auslese und durch die Herkunftsländer erweitere!
So sieht das Script aus:
demo.php
<?php setlocale (LC_TIME, "en_US"); // conncet to counter Database mysql_connect("localhost","user","password") or die(mysql_error()); mysql_select_db("Datenbankname") or die(mysql_error()); include 'iptocountry.php'; $entries = 0; // gespeicherte IPs und Zeit $ergebnis = mysql_query("SELECT id, ip, timed FROM counter-tabellenname ORDER BY timed DESC"); //---------------------------------------------- echo "<div align=\"center\"><table width=\"620\">"; while($t = mysql_fetch_object($ergebnis)) { $weekday = strftime("%a", $t->timed); $datum = strftime("%d. %b %Y", $t->timed); $uhrzeit = strftime("%H:%M:%S", $t->timed); // array Rückgabe von Funktion list ($land, $code2, $code3) = IPtoCountry($t->ip); // ---------------------------------------------------------- echo "<tbody><tr><td>$t->ip</td>"; echo "<td>$land</td>"; echo "<td>$code2</td>"; echo "<td>$code3</td>"; echo "<td>$weekday, $datum</td>"; echo "<td>$uhrzeit</td></tr>"; // Zähler erhöhen! $entries++; } // end While echo "</tbody></table>"; echo "Gesamtanzahl: $entries</div>"; ?>
demo.php liest Zeile für Zeile die Countertabelle ein, speziell die IP-Adresse wird mit dem Herkunftsland „verheiratet“ und dann ausgegeben. Es könnte in etwa so aussehen (IP-Adressen wurden unkenntlich gemacht!):
220.181.x.x | CHINA | CN | CHN | Sun, 22. Apr 2012 | 11:03:53 |
220.181.x.x | CHINA | CN | CHN | Sun, 22. Apr 2012 | 11:03:52 |
66.249.x.x | UNITED STATES | US | USA | Sun, 22. Apr 2012 | 11:03:47 |
157.55.x.x | UNITED STATES | US | USA | Sun, 22. Apr 2012 | 11:01:52 |
139.18.x.x | GERMANY | DE | DEU | Sun, 22. Apr 2012 | 10:54:54 |
66.249.x.x | UNITED STATES | US | USA | Sun, 22. Apr 2012 | 09:56:14 |
79.212.x.x | GERMANY | DE | DEU | Sun, 22. Apr 2012 | 09:55:06 |
Die Zeilen bedeuten hierbei:
IP-Adresse, Herkunftsland, 2-stelliger Country-Code, 3-stelliger Country-Code, Datum, Uhrzeit.
Diese Einträge könnten nun benutzt werden, um bestimmte IP-Adressen und Bereiche vom Zugriff auf die Webseite zu sperren. Denn leider sind unter den vielen Besuchern einer Webseite auch welche mit „bösen“ Absichten. Die verursachen unnötigen Webseiten-Traffic oder versuchen sich, wie bei mir, erfolgreich in Foren einzuhacken!
Wie man dies unterbindet oder unterbinden kann kommt demnächst in einem anderen Artikel hier!
Sollten zu dem Tool oben Fragen sein – wenn ich kann, helfe ich gerne!