Länder per PHP ermitteln – Schutz vor Spammern – GeoIP

Hallo,

da ich für mein Anti-Spam-Projekt MIGUmail nach einer Möglichkeit gesucht habe, Nutzer aus Ländern, die bekannt sind für Spam-Attacken (China, Indonesien, Brasilien, Thailand usw.), von vornherein nicht zur Registrierung zuzulassen.

Das ist schwieriger als man denkt, denn im Internet ist es nicht vorgesehen, dass man seine Länderkürzel mitschickt. Auch ist es nicht einfach über die IP-adresse eines Nutzers sein Herkunftsland zu ermitteln, denn dazu braucht man schon komplexe Datenbanken, die regelmäßig aufgefrischt werden müssen.

Zuerst lies ich mich über den Artikel auf phishmail.de inspirieren, die GeoIP-Funktion direkt in Apache zu nutzen. Davon habe ich aber Abstand genommen, da ich an meiner Apache-Konfiguration nichts mehr ändern wollte.

Also kam mir die Idee, diese GeoIP-Informationen mit meiner Leib-und-Magen-Sprache PHP zu nutzen.

Dazu benutzt man das Phpgeoip-Modul. Eine kleine Installationsanleitung kommt von Chris Hope. Ich selbst installiere das Modul einfach per Webmin.


apt-get install php5-geoip

Dann erfolgt der Neustart von Apache


/usr/sbin/apache2ctl graceful

Und siehe da, mit ein bißchen PHP:


print geoip_country_code_by_name($_SERVER['REMOTE_ADDR']);

erhalten Sie die Rückgabe “DE” für Deutschland.

Eh voilà, das war doch wirklich einfach.

Mit Hilfe einer aktuellen Top-10-Liste der schlimmsten Spammer-Länder und einer Übersicht der passenden Zwei-Buchstaben-Codes lässt sich schon einiges erreichen.


# blocking access from China or Russia
if (in_array (geoip_country_code_by_name($_SERVER['REMOTE_ADDR']) , array("CN","RU"))) {
 exit("Your country is not allowed");
}

Man kann auch gleich ganze Kontinente blocken:


# blocking access from South America or Asia
if (in_array (geoip_continent_code_by_name($_SERVER['REMOTE_ADDR']) , array("AS","SA"))) {
 exit("Your continent is not allowed");
}

Es gibt noch mehr interessante Befehle zu GeoIP. Allerdings sind einige nur in einer Profi-Version erhältlich. Damit lassen sich dann noch weitere Daten anhand der IP-Adresse ermitteln, bspw. die Stadt, der Staat, die geographischen Koordinaten, der Provider-Namen und noch einiges mehr. Für die hier angegebenen Beispiele reicht aber die Gratis-Version.

Natürlich sollte man auch die Datenbank von GeoIP immer aktuell halten. Dazu legt man sich ein Batch File an und kopiert es gleich nach “/etc/cron.weekly/“. Das sollte reichen.

#!/bin/sh
#
# updating the GeoIP Lite Database
cd /tmp
wget -q http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
if [ -f GeoIP.dat.gz ]
then
 gzip -d GeoIP.dat.gz
 rm -f /usr/share/GeoIP/GeoIP.dat
 mv -f GeoIP.dat /usr/share/GeoIP/GeoIP.dat
fi

Um diese Funktionen lässt sich natürlich einiges drumherum basteln. Z.B. kann man sich per Mail alarmieren lassen. Oder man nutzt diese Informationen, um den Nutzer auf eine anderssprachige Unterseite umzuleiten. Aber für letzteres bevorzuge ich das Auslesen der Länderkennung in den Browser-Informationen.

Dieser Artikel hat gezeigt, wie man mit Hilfe von GeoIP und PHP länderspezifische Aktionen durchführen kann. Über Anregungen oder Anmerkungen bin ich immer dankbar.