Schlechte Besucherzähler verbessern

Durch einen Verwandten bin ich nun auf ein paar Internetseiten gest0ßen die eine art Rangliste der Benutzerseiten aufgrund der Aufrufstatistiken aufstellt. Wer die meisten Klicks hat steht ganz vorne.

Soweit sogut ist die Idee, so ein Ranking zwischen beliebten und unbeliebten Profilen zu erstellen und den Besuchern das Navigieren zu häufig besuchten Seiten zu erleichtern. Nur leider wurde hier nicht ganz zu Ende gedacht (oder der zuständige Programmierer war einfach unfähig), denn auf dieser Seite seine eigenen Besucherzahlen in die höhe zu treiben ist so einfach wie Brot schneiden.

Mit Firefox alleine schon lassen sich mit intensivem Klicken auf den eigenen Profillink, so das Firefox mehrere Anfragen absendet, ohne Probleme bis zu 150 Klicks in kürzester Zeit (1 Minute) produzieren. Nicht auszudenken wären die Auswirkungen eines Scriptes welches von einem Server aus ausgeführt würde und jede Sekunde zwei mal klickt. Jeder könnte nach belieben seine Besucherzahlen gestalten, und es ginge nicht mehr danach wer der Bessere ist sondern wer die bessere Klickmaschine hat.

Dabei ist es doch garnicht so schwer das zu verhindern. Da die meisten dieser Seiten (und höchst wahrscheinlich auch diese spezielle) an eine Datenbank angebunden sind, lässt sich ein IP-Klick-Limiter doch ohne weiteres in wenigen Minuten einbauen. Alles was man hinzufügen muss ist eine Tabelle mit zwei Spalten und ein paar wenige Zeilen Code.

CREATE TABLE clicklimit (
 ip INT(14) NOT NULL,
 la INT(14) NOT NULL,
 PRIMARY KEY (ip)
)

Nun den PHP Teil:

 // aktuelle ip eintragen wenn sie nicht existiert,
 // mit time()-30 damit der klick gezaehlt wird
 mysql_query("INSERT IGNORE INTO clicklimit
 ( ip, la)
 VALUES ( ".ip2long($_SERVER['REMOTE_ADDR'])."
 , ".time()-30.")");
 
 // die daten fuer die aktuelle ip auslesen
 $req = mysql_query("SELECT * FROM clicklimit
 WHERE ip = ".ip2long($_SERVER['REMOTE_ADDR']));
 $tmp = mysql_fetch_array($req);
 $res = $tmp[0]; unset($tmp);
 
 // klick nur zaehlen wenn seit dem
 // letzten klick 30 sekunden vergangen sind
 if ( $res['la']+30 <= time() ) {
  // besucherzahl erhoehen code
 
  // nun die aktuelle ip akutalisieren,
  // damit man nicht betruegen kann
  mysql_query("UPDATE clicklimit SET
  la = ".time()." WHERE
  ip = ".ip2long($_SERVER['REMOTE_ADDR']));
 }

Wie man sieht nur wenige Zeilen zusätzlicher Code mit großer wirkung! Und ich hoffe das hilft einigen Webmastern und/oder Webdevelopern weiter und macht nicht nur Rankingsysteme sondern auch Online-Votings sicherer!