Pierre
09.06.2006, 10: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?
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?