IP2Country – mit PHP und MySQL

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!


Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*