Heute ist Saturday, der 15. December 2018

Spam trotz Captcha

Auf Grund einer wachsenden Spamflut in den Kommentaren habe ich mich dazu entschlossen ein Captcha in ve_guestbook zu integrieren. Etwas erstaunt war ich, daß dies die Spammer überhaupt nicht beeindruckte...

Im Gegenteil, bis zu 50 Spambeiträge wurden täglich neu eingetragen. Wie dies automatisch trotz Captcha funktionierte, war mir doch schleierhaft. Bei meinen manuellen Tests funktionierte das Captcha nämlich wie erwartet. Ach ja, die verwendete Captcha Extension ist Captcha Library (Key: captcha).

Um dem Problem auf die Spur zu kommen, habe ich in die Benachrichtigungsmails zunächst so erweitert, daß mir auch der eingegebene Captcha-String mit angezeigt wird. Sehr unwahrscheinlich, daß die wirklich das Bild parsen. Und siehe da, der übermittelte String war tatsächlich leer. Ein genauer Blick in den Code von ve_guestbook und captcha zeigte dann woran es lag.

Das captcha erzeugt eine Grafik mit dem Captcha-String. Gleichzeitig legt es den verwendeten String in die PHP-Session des aktuellen Nutzers. Wenn nun ein neuer Kommentar erstellt wird, holt sich ve_guestbook den Captcha-String aus der Session und vergleicht ihn mit den String des Nutzers.

Wenn aber ein Bot eine Nachricht schreibt, dann füllt er nicht vorher das Formular aus und lädt das Captcha-Bild. Er posted direkt die entsprechenden Daten. Ergebnis: In der Session liegt überhaupt kein Captcha-String. Also vergleicht ve_guestbook zwei leere Strings...

Abhilfe kann man schaffen, indem man zusätzlich prüft, ob überhaupt ein Captcha-String übermittelt wurde. Dafür bearbeitet man in der Datei typo3conf/ext/ve_guestbook/pi1/class.ve_guestbook_pi1.php die Methode checkForm(). In der Nähe der Zeile 1090 findet man folgendes Stück Code:

  1. if (t3lib_extMgm::isLoaded(\'captcha\') && $this->config[\'captcha\'] == \'captcha\') {
  2. session_start();
  3. $captchaStr = $_SESSION[\'tx_captcha_string\'];
  4. $_SESSION[\'tx_captcha_string\'] = \'\';
  5. if (!strlen($captchaStr) || $captchaStr != $this->postvars[\'captcha_response\']) {
  6. $error .= ...

Die zweite IF-Bedingung sollte man wie hier gezeigt anpassen.

Kommentare

herwig, 28-04-08 18:58:
DANKE! für den Hinweis.
Ich habe das gleiche Problem.
Hoffe es mit Deiner Hilfe nun gelöst zu haben.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\"Was interessiert mich Spam. Ich bin Vegetarier.\"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dani, 25-03-09 08:54:
Na hoffentlich hilft es auch weiter ;-) Ich werd das bei mir auch gleich mal überprüfen!! Danke!
Susanne, 06-05-09 09:49:
Bei mir funktioniert das irgendwie überhaupt nicht!! Findet man vielleicht noch eine Anleitung im Web? Ansonsten muss ich mal versuchen da durchzukommen...leider bin ich technisch nicht ganz so versiert.
Jochen, 07-08-09 15:28:
Vielen Dank für die ausführliche Information. Habe mich sehr darüber gewundert, wieso ich trotz Captcha Spam bekomme.

Grüße aus Karlsruhe
Jochen
Martin, 11-10-09 13:41:
Interessant, dass man das auch so machen kann!
Sollte einiges erleichtern, denke ich!
rafael, 04-02-11 13:19:
Vielen Dank für diese Hinweise. Nur, was kann ich machen, denn bei mir sieht der Code-Schnipsel (mailformplus) allerdings so aus:
(Danke für einen Tipp.
Rafael)

if ($this->conf[\'captchaFieldname\'] && $verifyCaptcha == 1) {

# get captcha sting
session_start();
$captchaStr = $_SESSION[\'tx_captcha_string\'];
$_SESSION[\'tx_captcha_string\'] = \'\';
if ($captchaStr != $this->get_post[$this->conf[\'captchaFieldname\']]) {
$temp = $GLOBALS[\"TSFE\"]->cObj->getSubpart($this->templateCode_error, \'ERROR_\'.$this->conf[\'captchaFieldname\']);
Add comment
*









*

*

* - required field