PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wir basteln uns einen Spam-Schutz für Foren



Pierre
09.06.2006, 11:25
Hallo,

seit kurzem habe ich massive Probleme mit Spam in meinem selbstentwickeltem Forum. Da ich nicht auf die Möglichkeit verzichten möchte, auch ohne Anmeldung das schreiben zu ermöglichen, musste ich mir ein paar Gegenmaßnahmen überlegen.

Hier sind ja schon stellenweise ein paar Ideen zusammengetragen wurden. Vielleicht können wir uns über eine konkrete Implementierung austauschen und diese verbessern.

Ich habe bei mir zwei Hürden eingebaut, die bisher in den letzten paar Tagen schon fast 1000 Bots aufgehalten haben.

Hürde 1: Individueller Zeitstempel

Jedes Formular bekommt zwei versteckte Variablen mit folgendem Inhalt:


private function addAntiSpamHash()
{
if (!$this->User->isOnline())
{
$time = time();
$this->addHidden('AntiSpamTime', $time);
$this->addHidden('AntiSpamHash', sha1($time.$this->Settings->getValue('antispam_hash')));
}
}


Wird das Formular abgeschickt, so wird folgende Methoden aufgerufen:


private function checkAntiSpamHash()
{
if (!$this->User->isOnline())
{
$now = time();

try
{
$time = $this->Io->getInt('AntiSpamTime');
$hash = $this->Io->getHex('AntiSpamHash');
}
catch (IoRequestException $e)
{
sleep(5);
$this->showFailure('Ungültige Formulardaten empfangen. Geh weg!');
}

if ($hash != sha1($time.$this->Settings->getValue('antispam_hash')))
{
sleep(5);
$this->showFailure('Manipulierte Formulardaten empfangen. Geh weg!');
}

if ($now - $time > $this->Settings->getValue('antispam_timeout'))
{
$this->showWarning('Deine Zeit ist abgelaufen. Schicke das Formular bitte erneut ab, und zwar innherlab der nächsten '.$this->Settings->getValue('antispam_timeout').' Sekunden.');
}
elseif ($now - $time < $this->Settings->getValue('antispam_wait'))
{
sleep($this->Settings->getValue('antispam_wait'));
$this->showWarning('Du warst zu schnell. Schicke das Formular bitte erneut ab.');
}
}
}


Das ist natürlich trivial, sperrt aber wohl die meisten Bots aus. Denn der Bot wird erkannt wenn:
* er schickt die versteckten Felder nicht mit
* er schickt immer die gleichen Feldinhalte mit (hat also nur einmal das Formular analysiert)
* er versucht den Zeitstempel zu ändern
* er schickt seine Daten zu schnell ab

Was hier noch durchkommt, kann man ganz gut mit einer Blacklist in den Griff bekommen. Hier bei vergleiche ich alle im Beitrag enthaltenen Domains mit einer Liste. Eigentlich könnte man solche Listen auch Board-übergreifend nutzen.

Was haltet ihr davon? Was könnte man verbessern?

der Spandauer
09.06.2006, 11:53
Was haltet ihr davon? Was könnte man verbessern?

Wie gehen Bots eigentlich mit Cookies um?
Könnte mir vorstellen das da etwas gepfuscht wird.
zB ein Cookie setzen der schon abgelaufen ist (Datum<2005), wenn der trotzdem Abfragbar ist-> Tonne.
oder Cookie setzen der für eine andere Domain ist usw.

oder den Beitrag zum Schein annehmen, sichtbar ist er aber nur für die eine IP, und das auch nur für eine begrenzte Zeit.

Bin kein Experte :o nur mal so als Idee :rolleyes:

homer
09.06.2006, 11:54
Was haltet ihr davon? Was könnte man verbessern?
Hmm, die "versteckten" Felder sind nur dem Betrachter im Browserfenster versteckt. Eine Quelltextanalyse, wie sie anscheinend einige GB-Spammer durchführen, findet solche Felder.
Ich würde beim SHA1-(oder MD5- oder wasweisichnoch-)Hash noch ein eigenes Passwort mitschicken, so in der Art


$time = time();
$passwort = '_Zeo+a+qhFao1wfNFbQjV+fhtVUKZUbVpLBhcsbKzXVaLhLoqk';
$hash = sha1($time.'-'.$passwort);

$hash und $time versteckt im Formular mitschicken. Wenn jemand $time manipuliert kann man das bequem prüfen, weil ja $passwort fest im Quelltext hinterlegt wurde.

Pierre
09.06.2006, 11:58
Hallo Homer: Ich setze die Hash-Funktion bereits auf time() und einen nur dem Server bekannten String an. Klar, kann ein Spammer den Quelltext analysieren. Allerdings ist es unmöglich, an gültige Hashwerte zu kommen, ohne das Formular erneut aufzurufen. Und das machen die Bots bisher kaum.

Konkret tut das die Zeile


sha1($time.$this->Settings->getValue('antispam_hash'))

Wobei antispam_hash ein serverseitiger, aber konstanter Wert ist.

Pierre
09.06.2006, 12:31
Wie gehen Bots eigentlich mit Cookies um?
Könnte mir vorstellen das da etwas gepfuscht wird.
zB ein Cookie setzen der schon abgelaufen ist (Datum<2005), wenn der trotzdem Abfragbar ist-> Tonne.
oder Cookie setzen der für eine andere Domain ist usw.

oder den Beitrag zum Schein annehmen, sichtbar ist er aber nur für die eine IP, und das auch nur für eine begrenzte Zeit.

Bin kein Experte :o nur mal so als Idee :rolleyes:

Das mit dem Cookie könnte ganz interessant sein; allerdings weiß ich nicht, was die Browser sagen, wenn man versucht ungültige Cookies zu setzen.

Den Beitrag zum Schein anzunehmen könnte nach hinten los gehen. Selbst wenn die Bots sowas prüfen (was ich nicht glaube), so würden sie dann erst recht weitermachen, da es vermeintlich erfolgreich war.

der Spandauer
09.06.2006, 13:03
Den Beitrag zum Schein anzunehmen könnte nach hinten los gehen. Selbst wenn die Bots sowas prüfen (was ich nicht glaube), so würden sie dann erst recht weitermachen, da es vermeintlich erfolgreich war.

Der Täuschungsversuch ist ja auch nur für die Wetware, der soll denken sein Bot funktioniert. Fazit: Er rüstet sein Bot nicht auf.
Wenn er mehrmals postet kann man ihn ja mit einer Teergrube o.ä. ausbremsen. Auch berechtigte User werden wohl nicht in Sekundentakt Beiträge abfeuern, also könnte man alle für mindestens 1 Minute ausbremsen, wenn sie einen zweiten Beitrag (selbe IP) abfeuern.

Pierre
10.06.2006, 11:02
Ich habe das Bot-Verhalten mal etwas anhand des Apache-Logs analysiert. Das Ergebnis: Sie kommen mit Cookies und Zeitverzögerungen klar und laden auch das Formular neu. Was sie aber nicht können: CSS interpretieren und Bilder laden. Das nutze ich nun aus.

spamvamp
16.06.2006, 11:41
Kann man nicht so ein Bild mit Buchstaben einbauen?

Fine
18.06.2006, 21:17
Kann man nicht so ein Bild mit Buchstaben einbauen?

genau diese Frage hätte ich auch aber ich glaub wirklich viel bringts doch sicher auch nicht oder?

In meinem Blog ist es auch mit diesem Feld geschützt und trotzdem kommen welche durch :(

Stefreak
20.06.2006, 08:02
In meinem Blog ist es auch mit diesem Feld geschützt und trotzdem kommen welche durch :(

Es ist ja auch oft so, dass diese blöden Bots nur halbautomatisch sind, dh die Bildchen werden manchmal von Menschen abgetippt


MfG
Stefreak

Pierre
20.06.2006, 13:38
Bisher bin ich Spam-frei. Man muß wohl zwei Dinge beachten: Der Schutz darf nicht automatisch umgangen werden und sollte einzigartig in der Implementierung sein.