Php

Gästebuch vor Spam schützen (Php Tutorial)

Tutorial erstellt von C4D_Joe, letzte Änderung am 13.07.2007

Aufbau des Tutorials


  • Einleitung

  • Merkmale von Spam

  • Lösungsvorschläge

  • Sonstige Tipps&Tricks

  • Komplette Funktion, die alle hier vorgestellten Methoden verwendet

  • Schluss



Einleitung

Ein herzliches „Hallo“ an alle, deren Gästebuch mit Spam zugemüllt wird und an alle die selbiges verhindern wollen ;-)
Wir werden in diesem Tutorial versuchen, ein Gästebuch vor Spam(-bots) zu schützen, ohne den „ehrlichen“ Benutzer durch die Eingabe eines visuellen Sicherheitscodes zu nerven.
Grundkenntnisse in PHP setze ich jetzt einfach mal voraus, ich werde die Mini-Scripts aber ausführlich kommentieren.
Ich werde auch nicht den kompletten Aufbau eines Gästebuchs beschreiben, dazu gibt es ja schon ein Tutorial hier. Die folgenden Code-Schnipsel können einfach in in das Gästebuch aus eben diesem Tutorial eingebaut werden.

Merkmale von Spam

Wie also können wir gegen Spam ankommen?
Dazu müssen wir uns erstmal überlegen, was so ein Spambot überhaupt will (…und die menschlichen Spammer meistens auch).


  • Nach Dateien suchen, die gaestebuch.php o.Ä. heißen

  • Jedes Formularfeld ausfüllen, das er finden kann

  • Viele Links eintragen

  • Für Produkte und Angebote werben

  • Die Seite mehrfach besuchen und mehrere Einträge machen



Nun werden wir versuchen, diese Verhaltensweisen auszunutzen:
Lösungsvorschläge

Punkt 1:
„Nach Dateien suchen, die gaestebuch.php o.Ä. heißen“. Die Lösung dazu ist schnell erklärt und umgesetzt:
Kreativität ist beim Benennen von Dateinamen gefragt! Die Datei sollte nicht gaestebuch.php, guestbook.php oder ähnlich einfallslos heißen. Denn genau nach solchen Namen suchen Spambots. Warum die Datei nicht z.B. annyeonghaseyo.php („Annyeonghaseyo“ ist koreanisch und heißt „Hallo“ :D) nennen?

Punkt 2:
„Jedes Formularfeld ausfüllen, das er finden kann“. Schließlich ist ein Bot darauf programmiert, jedes Formularfeld auszufüllen, um nicht an einer Vollständigkeitsüberprüfung zu scheitern.
Wir fügen dem Formular ein weiteres Feld hinzu, welches für einen „normalen“ Benutzer unsichtbar ist und deshalb nicht ausgefüllt werden kann. Der Bot weiß das jedoch nicht und füllt das Feld trotzdem aus. Deshalb werden wir also überprüfen, ob dieses Feld ausgefüllt wurde. Wenn ja - Pech für den Spambot, wir haben ihn ausgetrickst.
Ein unsichtbares Feld machen wir ganz einfach so:

  Code:
<input type="text" name="website" size="10" maxlength="50" style="display: none;" />


Beim Namen für das unsichtbare Feld müssen wir auf zwei Dinge achten.
Erstens: Es sollte einer sein, auf den ein Bot gerne reagiert. Dafür bieten sich z.B. „email“, „website“ o.Ä. an.
Zweitens: Der Name darf von keinem anderen Feld im Formular verwendet werden.

Die Überprüfung könnte dann z.B. so aussehen:

Code:
if(!empty($_POST['website'])) { // Wenn im Formularfeld 'Website' etwas drinsteht, dann…
      header("refresh:0;url=index.php"); // …sofort auf die Startseite umleiten
      }


Punkt 3:
„Viele Links eintragen“. Das ist natürlich das Hauptziel eines jeden Spammers. Aber auch das kann man recht einfach verhindern:
Wir überprüfen, wie oft der Text „http://“ im Eintrag vorkommt. Sollten es mehr sein als in der Variable $maximal definiert, wird eine Fehlermeldung ausgegeben und der Spammer auf die Startseite umgeleitet.

      Code:
$links = substr_count($message, 'http://'); // Nach Links suchen
      $maximal = 2; // Maximale Anzahl an Links festlegen
      if ($links > $maximal) { // Wenn mehr Links als erlaubt, dann …
      echo ('Es sind nur '.$maximal.' Links pro Beitrag erlaubt.'); // Fehlermeldung ausgeben.
      header("refresh:3;url=index.php"); // Nach drei Sekunden auf die Startseite umleiten.
      }


Punkt 4:
„Für Produkte und Angebote werben“. Hierfür hilft nur eine sogenannte Badwordslist - eine Aufzählung von Worten, die nicht in einem Eintrag vorkommen dürfen. Dafür werden wir ein Array erstellen, in welchem die „bösen“ Wörter eingetragen sind. Dann werden wir überprüfen, ob im Eintrag eines dieser Wörter vorkommt. Wir sollten darauf achten, dass der Filter nicht zu streng ist, denn es kann durchaus vorkommen dass jemand durch Wortkombinationen unbeabsichtigt „böse“ Wörter einbaut (etwas holpriges Beispiel: „Fuchsexperte“ „Fuchsexperte“).
Der Code ist wieder recht einfach:

      Code:
$badwords = array("viagra", "porn", "undsoweiter", "undsofort"); // „Böse“ Wörter festlegen.
      foreach ($badwords as $word) { // Schleife, die so oft durchläuft, wie Elemente im Array sind
      if(eregi($word, $message)) { // Wenn in der Nachricht eines der bösen Wörter ist, dann …
      $error = TRUE; // … $error auf TRUE setzen.
      }
      }
      if($error) { // wenn $error gesetzt ist, dann …
      echo('Im Beitrag wurden nicht erlaubte Wörter verwendet.'); // … Fehlermeldung ausgeben.
      header("refresh:3;url=index.php"); // Nach drei Sekunden auf die Startseite umleiten.
      }


Punkt 5:
„Viele Einträge machen“. Hierzu sage ich nur: Loggt die IP-Adresse mit! Baut eine Zeitsperre ein, so dass pro IP z.B. nur alle 3 Stunden ein Eintrag erfolgen kann.
Ich will hier keine Schritt-für-Schritt-Anleitung liefern, weil das Prinzip wieder das gleich ist (Bedingung prüfen Wenn Anzeichen auf Spam, dann Fehlermeldung ausgeben bzw. Umleiten auf andere Seite). Außerdem gibt es auf der-webdesigner.net schon ein schönes Counter-Tutorial mit Zeit-Sperre, so kann man sich auch hier Anregungen holen.

Außerdem will ich hier noch weitere Tipps und Vorschläge aufzählen:

Sonstige Tipps&Tricks



  • Eingaben auf Korrektheit prüfen. (Kann die E-Mail-Adresse stimmen? Wie lang ist die Nachricht?)

  • Spam-Einträge nicht blocken, sondern auf separates Gästebuch umleiten. (Stellt ein Spambot fest, dass sein Eintrag geblockt wird, kann es sein dass bald ein verbesserter Bot auftaucht. Somit könnte man Bots auf ein eigenes „Spam-Book“ umleiten, in dem sie sich „austoben“ können. Natürlich sollte man aber auch hier regelmäßig aufräumen.)

  • Wenn trotz all dieser Maßnahmen noch Einträge von Spambots erfolgen: Ein Captcha einbauen. (Das ist eben das, was wir eigentlich vermeiden wollten. Aber gegen Spam-bots gibt es kaum etwas besseres.)



Jetzt haben wir einige Code-Schnipsel, die recht zuverlässig vor Spam schützen und sowohl menschliche Spammer als auch Spambots ausbremsen dürften.
Sollte tatsächlich jemand alle Methoden auf einmal einsetzen wollen, dann könnt ihr folgende einfache Funktion verwenden, die ich zusammengestellt habe:

Komplette Funktion

Code:
<?
function filter($message) {
if(!empty($_POST['website'])) {
$error = TRUE;
$errormsg .= 'Spambot identifiziert.<br />';
}
$links = substr_count($message, 'http://');
$maximal = 2;
if ($links > $maximal) {
$error = TRUE;
$errormsg .= 'Es sind nur '.$maximal.' Links pro Beitrag erlaubt.<br />';
}
$badwords = array("viagra", "porn", "undsoweiter", "undsofort");
foreach ($badwords as $word) {
if(eregi($word, $message)) {
$error = TRUE;
$errormsg .= 'Es wurden nicht erlaubte Wörter verwendet.';
}
}
if($error) {
$errormsg .= header("refresh:3;url=index.php");
}
return $errormsg;
}
?>


Diese Funktion könnt ihr sehr einfach in die meisten Gästebücher einbauen.

Schluss


Ich hoffe, dass mein erstes Tutorial verständlich war und dass der ein oder andere Geplagte sich Anregungen holen oder Code-Schnipsel verwenden konnte.
Bei Fragen, gefundenen Fehlern, Verbesserungsvorschläge o.Ä. meldet euch bitte per PN, E-Mail (johannes@pandj.de) oder ICQ.

Gruß, Joe

>> Allgemeine Fragen oder Probleme mit dem Tutorial? Hier gehts zum Forum!

Impressum / Datenschutzerklärung          © der-Webdesigner.net 2002 - 2008           top ▲