Formular-Spambots aussperren

Hier bekommst Du deutschsprachigen Support. Keine Fehlermeldungen oder Erweiterungswünsche bitte!
Post Reply
thoblerone
Posts: 110
Joined: Fri 27. Jan 2006, 23:34
Location: Essen, Germany
Contact:

Formular-Spambots aussperren

Post by thoblerone »

Leider hatte ich das Problem, dass auf meiner Seite das Kontaktformular von Spambots missbraucht wurde, um uns täglich mehrere Dutzend lästige Mails zu senden, obwohl sowohl Mathe-Spam als auch Google Recaptcha aktiv waren. Offensichtlich kommen "die bösen Jungs" damit schon klar. Andererseits sind sie generell super mitteilsam und füllen brav alle Formularfelder mit ihrem Schrott aus.

In meiner Lösung gibt es für humane Besucher nun nur noch die normalen Textfelder, Spambots sehen (bisher) einen "Honigtopf" mehr. Dieser ist per CSS-Style "visibility:hidden" ausgeblendet. Mit Hilfe der PHP basierten Formularprüfung lässt sich nun das Absenden des Spam wirksam verhindern.

Damit ich das selber auch einmal wiederfinde, hier Schritt für Schritt:
  1. PHP Datei erstellen und hochladen in Verzeichnis /template/inc_script/frontend_init, Rechte 644. Dateiname spielt keine Rolle, z.B. ValidateFormSubmission.php, mit Inhalt:

    Code: Select all

     <?php
     /********************************************************************************************/
     /**
      * Testet auf diverse Formulareingaben, hier angepasst auf das Abfangen von Spam mit einem Honigtopf-Feld
      */
     /********************************************************************************************/
     // -------------------------------------------------------------------------------------------
     // obligate check for phpwcms constants
     if (!defined('PHPWCMS_ROOT')) {die("You Cannot Access This Script Directly, Have a Nice Day."); }
     // -------------------------------------------------------------------------------------------
     
     function Stop_SpamValidateFormSubmission( &$postvar, &$form, &$mail ) 
     {
     	//debug_print_backtrace();
    
    	// Sicherheitsrisiko wenn vergessen wird diese Zeilen nach Ende der Arbeiten zu entfernen.
    	//echo '<br />===== postvar ===========================<br />';
    	//dumpVar($postvar);
    	//echo '<br />===== $POST ===========================<br />';
    	//dumpVar($_POST);
    	// echo '<br />===== form ==============================<br />';
    	// dumpvar($form);
    	//echo '<br />===== mail ==============================<br />';
    	// ist für die meisten anwendungen uninteressant:
    	//dumpvar($mail);
    	//echo '<br />===== mail ende =========================<br />';
     
    	foreach ($_POST as $key => $value)
    	{
    		// Spam bots like to post web adresses. Error everywhere if a field data contains http, except the allowed refferer field named "kommt_von_seite"
    		if (strpos($key, "	" ) !== false)
    			// empty data is OK
    			continue;
    
    		if (strpos($key, "kommt_von_seite") !== false) // this field is allowed to contain http in its data
    			continue;
    
    		if (strpos($value, "http") !== false)
    		{
    			// this field data contains the text http - this is probably a bot 
    			// echo ("<pre>Value = $value, Key = $key</pre>\r\n");
    			die ("<br />We are sorry but your data could not be processed. Please call if you find this should not have happened. Error: ". __LINE__ /*." @". __FILE__ */);
    		}
    	}
    
    	if (isset($_POST["hnypot"]) && $_POST["hnypot"] !== "your spam here")
    	{
    		// the bot has filled out every text element in our form, even the hidden honeypot field.
    		die ("<br />We are sorry but your data could not be processed. Please call if you find this should not have happened. Error: ". __LINE__ /*." @". __FILE__*/);
    	}
     }  
    ?>
    1. Inhalt der Datei s. unten.
  2. Im CP Formular wird ein neues Feld eingefügt:
    1. Typ = Text (mehrzeilig)
    2. Name = hnypot
    3. Label = (bleibt leer)
    4. M/R = 3 (nicht so wichtig, ein bisschen Platz für Spam :) )
    5. Wert = your spam here
    6. Fehlertext = (bleibt leer)
    7. CSS Klasse = (bleibt leer)
    8. CSS Stil = visibility:hidden
  3. Weiter unten, unterhalb der Empfänger-Vorlage
    1. PHP-Funktion = Stop_SpamValidateFormSubmission
  4. Formular kann gesichert werden
    • Zum Ausprobieren den CSS-Stil vom "Honigtopf"-Feld entfernen, der dadurch sichtbar wird. Wird dessen Wert nicht geändert, wird das Formular versendet, steht dort etwas anderes als "your spam here" erhält man einen Serverfehler

    Anmerkungen:
    • Die meisten Bots senden über das Kontaktformular Text mit URLs. Enthält ein Textfeld den String "http" führt dies hier ebenfalls zu einer Fehlermeldung. Das mag nicht in jedem Anwendungsfall erwünscht sein.
    • In meinen Formularen setze ich regelmäßig ein Hidden Feld für den Referrer, das heißt bei mir "kommt_von_seite" und kann natürlich "http" enthalten. Daher wird dieses Feld gar nicht weiter geprüft.
    • Die Funktion greift auf die $_POST Daten zurück und nicht auf den Eingangsparameter $postvar. Dieser ist nur gesetzt (und dann nahezu identisch zu $_POST), wenn im Formularkopf unter Datenbank "Formularergebnis speichern" gesetzt wurde. Gepeichert wird allerdings bevor die Prüfunktion aufgerufen wird und so landen dann auch alle Spam-Anfragen in der Datenbank.
    • Leider ist die Prüffunktion kein Rückgabewert vorgesehen. Wenn die Prüfung durchfällt ist ein die(...)-Befehl die einzige Option, das Backend vom Versenden der Mail abzuhalten. Sieht hässlich aus, aber nur für den Bot, und der ist selbst hässlich :)
    User avatar
    Oliver Georgi
    Site Admin
    Posts: 9888
    Joined: Fri 3. Oct 2003, 22:22
    Contact:

    Re: Formular-Spambots aussperren

    Post by Oliver Georgi »

    Danke!

    Grundsätzlich sind Spambots an Formularen interessiert, die Nutzern die eingegebenen Daten in der Bestätigungsmail zusenden. Das sollte dringend vermieden werden. Dann hält sich der Spam eher in Grenzen, so meine Erkenntnis.
    Oliver Georgi | phpwcms Developer | GitHub | LinkedIn | Систрон
    thoblerone
    Posts: 110
    Joined: Fri 27. Jan 2006, 23:34
    Location: Essen, Germany
    Contact:

    Re: Formular-Spambots aussperren

    Post by thoblerone »

    Ich habe das Script jetzt seit drei Monaten auf zwei Webseiten im Einsatz und folgendes Fazit:

    Vorher ca. 20 Spambot-Anfragen täglich - jetzt null :)

    Aber ich muss Olivers Erfahrung wiedersprechen: eine Bestätigungsmail wurde auch in der Vergangenheit nicht ausgesendet. Meine Formulare sind wohl irgendwie anders für Bots interessant geworden...
    kmstario
    Posts: 396
    Joined: Thu 27. Jul 2006, 11:34
    Location: Berlin
    Contact:

    Re: Formular-Spambots aussperren

    Post by kmstario »

    Moin moin,

    da ich auf einer Webseite auch das Problem hatte dass ein Formular permanent mit Spam "bombardiert" wird, habe ich das Script mal eingebunden aber bedauerlicher weise funktioniert es überhaupt nicht :( .

    Habe es genau wie in der Anleitung eingebunden aber trotzdem kommen täglich ca. 400 Mails, auch ohne Kopie also zweite Mail.

    Vg Andreas
    --------------------------------------------

    Alles Gelingen hat sein Geheimnis, alles Mißlingen seine Gründe.
    PHPWCMS ist einfach nur großartig!
    User avatar
    Oliver Georgi
    Site Admin
    Posts: 9888
    Joined: Fri 3. Oct 2003, 22:22
    Contact:

    Re: Formular-Spambots aussperren

    Post by Oliver Georgi »

    Es gibt eine ganz einfache Regel! Bestätigungsemails grundsätzlich NIE mit den Inhalten aus dem Formular versenden. Nur dann ist das Formular überhaupt von Interesse für Spammer. ReCaptcha hilft sonst auch nicht, da Clickworker für das Lösen von Captchas bezahlt werden.
    Oliver Georgi | phpwcms Developer | GitHub | LinkedIn | Систрон
    thoblerone
    Posts: 110
    Joined: Fri 27. Jan 2006, 23:34
    Location: Essen, Germany
    Contact:

    Re: Formular-Spambots aussperren

    Post by thoblerone »

    Hallo Oliver,

    ich versende keine Bestätigungsmail mit dem Formularinhalt.

    Hallo Andreas,

    lasse zunächst einmal beim "Honigtopf"-Feld hnypot den CSS Stil visitility:hidden weg, dadurch wird das Feld sichtbar und Du kannst darin selbst zum Testen etwas ändern. Schreibe Dir nun selbst Nachrichtem mit vermutlich nicht gewolltem Inhalt: Änderung am Honigtopf bzw. http im Nachrichtentext. So lange diese durchkommen, stimmt noch etwas nicht.

    Die erste Frage ist, ob überhaupt die Validierungsfunktion benutzt wird. Das lässt sich leicht prüfen, wenn vorübergehend die Kommentare bei den Zeilen mit den echo-Befehlen entfernt werden. Falls die Prüffunktion überhaupt aufgerufen wird, erzeugst Du so eine (etwas seltsam formatierte) Ausgabe. Falls die nicht erscheint liegt der Hase nicht bei der Prüffunktion sondern am nicht stattfindenden Aufruf. Zum Beispiel: wurde der Name der Prüffunktion korrekt im Formular angegeben?

    Auf meinem Live-Server funktioniert das noch unter V 1.7.0.532, das identische Setup ebenfalls lokal auf Xampp unter V 1.9.8.549

    Gruß
    Thomas
    thoblerone
    Posts: 110
    Joined: Fri 27. Jan 2006, 23:34
    Location: Essen, Germany
    Contact:

    Re: Formular-Spambots aussperren

    Post by thoblerone »

    Aus der Abteilung "einfache Fehler" und "blöde Rückfrage" :)

    Die php-Funktion hast Du doch im Feld “PHP-Funktion:” unterhalb der “Empfänger - Vorlage:“ eingetragen und nicht unterhalb der "Kopie an - Vorlage"?

    LG
    Thomas
    Post Reply