Einfacher Formularspamschutz mit JavaScript

Thursday, April 23, 2009 4:52:20 PM (Mitteleuropäische Sommerzeit, UTC+02:00)

Im dotnet-forum.de kommt es immer wieder vor, das sich Spammer registrieren. Diese Spammer registrieren sich unter zufällig erzeugten Namen und das war’s. Sie posten nichts und hinterlassen nicht einmal einen Link im Profil. Was die Spammer mit diesen Registrierungen erreichen wollen, ist mir ein Rätsel. Sicher ist nur, dass diese Anmeldungen manuell durchgeführt werden, das habe ich durch ein paar Experimente herausgefunden. Was die Spammer scheinbar noch nicht mitbekommen haben, ist, dass sie nach wenigen Minuten verbannt werden. Ein verbannter User kann sich nicht einmal anmelden. Das automatische Verbannen erreiche ich mit Hilfe eines Spamfilters, den ich für den CommunityServer entwickelt habe. Der Filter findet bekannte Spamadressen über einen externen Dienst und nutzt zusätzlich eine Blacklist, die ich selbst pflege. Somit arbeitet er sehr zuverlässig. Diesen Spamfilter habe hier schon einmal vorgestellt.

Im zweiten Schritt der Spambekämpfung habe ich etwas früher angesetzt, damit die Spammer sich erst gar nicht anmelden können. Ich habe nach einer Lösung gesucht, mit der ich Personen aussperren kann, die kein Deutsch können. Das hat nichts mit meiner politischen Einstellung zu tun, sondern damit, dass Spammer oft aus Ländern kommen, in denen die Arbeitskraft wenig kostet…

Zur Lösung des Problems gab mir Thomas einen entscheidenden Tipp. Er hat eine serverseitige Lösung mit dem Namen The Riddle entwickelt. Der User, der das Formular absenden möchte, muss zwei Zahlen addieren und das Ergebnis ausgeschrieben in eine TextBox eintragen. Damit setzt man voraus, dass der User etwas deutsch kann und ggf. auch mit Umlauten umgehen kann. Zuerst wollte ich die Lösung von Thomas übernehmen, habe mich aber später dafür entschieden, eine clientseitige Variante davon zu entwickeln. Das hat den Vorteil, dass Assemblys des zugrunde liegenden Systems (im meinem Fall CommunityServer) nicht angefasst werden müssen. Es wäre auch auf nicht-.NET Systeme leicht übertragbar.

Spamschutz

Bei meiner Lösung ist der Absende-Button deaktiviert wenn das Formular geladen wird, hat man das Ergebnis richtig ausgeschrieben, wird der Button aktiviert und das Registrierungsformular kann abgesendet werden.

Es folgt das kurze JavaScript:

var numbers = new Array("null", "eins", "zwei", "drei", "vier", "fünf", "sechs", "sieben", "acht", "neun", "zehn", "elf", "zwölf", "dreizehn", "vierzehn", "fünfzehn", "sechzehn");
var number1;
var number2;
var SendButtonID = ""; // ID des Absende - Buttons eintragen!

function InitializeRiddle() {
number1 = GetRandomNumber();
number2 = GetRandomNumber();
document.getElementById("task").innerHTML = "<b>Spamschutz: Addiere " + numbers[number1] + " und " + numbers[number2] + " !</b><br />Das Ergebnis muss <b>ausgeschrieben</b> werden.<br />Beispiel: sieben und sechs ergeben dreizehn!";
}

function CheckResult() {
var result = number1 + number2;
var resultToCheck = document.getElementById("result").value.toLowerCase();
resultToCheck = resultToCheck.replace(/ö/g, '&ouml;');
resultToCheck = resultToCheck.replace(/ü/g, '&uuml;');

if (numbers[result] == resultToCheck) {
document.getElementById(SendButtonID).disabled = false;
}
else {
document.getElementById(SendButtonID).disabled = true;
}
}

function GetRandomNumber() {
var randomNumber = Math.random();
randomNumber = 8 * randomNumber;
randomNumber = Math.round(randomNumber);
return randomNumber;
}

Den Spamschutz kann hier ausprobiert werden.

Fazit: So ein Schutz kann es den Spammern immer nur erschweren ihr Vorhaben umzusetzen und somit hab ich auch die Spammer nicht vollständig aussperren können. Es war allerdings ein deutlicher Rückgang an russischen und indischen Registrierungen spürbar. Außerdem schützt es das Forum vor Usern die nicht 6 und 7 addieren können ;-)

Wenn ihnen der Artikel gefallen hat oder er für sie hilfreich war,
bitte "kicken" sie ihn.

Kick it on dotnet-kicks.de


Thursday, April 23, 2009 11:10:48 PM (Mitteleuropäische Sommerzeit, UTC+02:00)
Hört sich ja nach einer viel versprechenden Lösung an.
Aber ich würde in noch eine Server seitige Prüfung der Daten vornehmen.

Mit den Plugins "Web Developer" und "FireBug" für den FireFox hat es keine Minute gedauert bis der Schutz umgangen war.

Klar werden sich die "manuellen Spammer" nicht die Mühe machen den Schutz so zu umgehen, aber eine Überlegung um für die Zukunft gerüstet zu sein wäre es Wert
Timo
Friday, April 24, 2009 9:51:07 AM (Mitteleuropäische Sommerzeit, UTC+02:00)
Prima Lösung. Aber wie Timo schon sagt, rein client-seitig läßt sich das leicht umgehen, Du disablest ja lediglich den Submit-Button.
Comments are closed.