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.
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, 'ö');
resultToCheck = resultToCheck.replace(/ü/g, 'ü');
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 