Auf vielen Seiten gibt es noch Gästebuücher. Vor allem im privaten Umfeld oder auch bei kleineren Unternehmen sind diese immer wieder zu finden. Und genau diese sind sehr oft Ziel von Spam-Angriffen. Hierbei wird ein Werbetext als Gästebucheintrag verfasst. Diese sind üblicherweise lang und gespickt mit Links. Genauso wie man keine Spam-Emails haben möchte ist der Betreiber der Seite daran interessiert diesen Kram zu erhalten und im schlimmsten Fall auch noch gleich ins Netz zu stellen.
Vor kurzem wurde ich vor vor dieses Problem gestellt und es galt eine Lösung zu finden, die einigermaßen sicher ist. Die erste Idee ist immer den Eintrag nach Links zu durchsuchen. Normalerweise wird ein kleiner dankender Gästebucheintrag nicht viele Links enthalten und hier hatte der ehemalige Entwickler schon mitgedacht und Einträge mit mehr als einem Link wurden nicht angenommen.
Leider haben sich die Spamschreiber auf dieses Problem eingestellt und die Links anders kodiert. Die Schreibweise entsprach eher dem BBCode oder ähnlichem. Die langen Texte wurden also weiterhin gesendet.
Die nächste Idee war, einen Dienst zu nutzen, der schon existiert. Also Akismet anzubinden war naheliegend, aber vor allem bei gewerblicher Nutzung kostenpflichtig. Auch muss man den Gästebuch-Eintrag in eine Art Kommentar umwandeln, sodass Akismet diesen versteht. Da dies zwar technisch spannend, aber schon einen kleinen Eingriff an der bestehenden Seite erfordert hätte galt es eine simplere Lösung zu finden.
Man musste also die richtigen Fragen stellen.
- Was macht einen Spameintrag aus?
- Was will ein Spammer erreichen?
- Was kann ein Spammer nicht leiden?
Der Spameintrag unterscheidet sich von einem regulären Eintrag vor allem durch seine Länge. Diese ist überproportional hoch. Somit sind lange Einträge tendenziell eher Spam; kurze Einträge eher nicht.
Der Spammer möchte seinen Werbetext auf vielen Seiten veröffentlichen und dazu möglichst wenig Zeit aufwenden.
Ein Spammer möchte nicht lange warten (darum funktioniert das Greylisting ja auch so schön). Somit verfasst er den Text im voraus und kopiert ihn im Ganzen ins Eingabefeld.
Also ist die Idee bei der Anzeige des Formulars in der Session einen Timestamp zu hinterlegen. Beim Speichern wird dieser Timestamp mit der aktuellen Uhrzeit verglichen. Hierzu kann man sich überlegen, wieviele Zeichen pro Minute eine Person tippt. Also geht man mal von 150 Anschlägen aus. Jetzt zählt man die Zeichen des Textes und teilt diese durch die Anzahl der Anschläge. Somit findet man heraus wieviele Minuten man für diesen Text braucht. Das rechnet man dann noch in Sekunden um und addiert einen Wert für die üblichen Formularfelder wie Name, Email etc hinzu. 10 Sekunden sind dafür okay.
Also kann man eine lineare Funktion bilden:
\(y = x \times \frac{60}{150} + 10\)
(x = Anzahl der Zeichen im Text, y = errechnete Zeit, um den Text zu schreiben)
Jetzt erhalten wir eine grobe Abschätzung für die Zeit, die ein Mensch braucht, um den Text einzutippen. Bildet man nun die Differenz zwischen Anzeige-Timestamp und Empfangs-Timestamp, dann weiß man wie lange für die Eingabe wirklich gebraucht wurde. Die Zeit muss größer als der errechnete Wert y sein. Und genau dann wird der Gästebucheintrag angenommen, ansonsten eben abgewiesen. Mit dieser Methode werden dann kopierte Texte abgefangen und das Gästebuch ist wieder spamfrei – vorerst 🙂