www.PHP-Kurs.com

PHP lernen für Einsteiger
und Fortgeschrittene

PHP-Tutorial mit Videos

Sie befinden sich: Startseite » PHP für Fortgeschrittene » Spam vermeiden im Kontaktformular

Spam vermeiden im Kontaktformular

Oder: warum man hunderte Anfragen über das eigene Kontaktformular bekommt

Bestandsaufnahme: Wir haben ein Kontaktformular, in dem neben dem Namen und den Anfragegrundgrund auch eine E-Mail-Adresse und eine URL abgefragt wird. Diese abgefragten Daten werden uns durch das PHP-Kontaktformular per E-Mail gesendet, wenn jemand das Formular ausfüllt und absendet.

Nerviger Effekt: Wir bekommen hunderte von Anfragen pro Tag, die offensichtlich SPAM sind. Warum passiert das? Es gibt SPAM-Roboter, die nach Onlineformularen suchen und diese einfach ausfüllen. Man fragt sich jetzt natürlich, wer hat was davon und warum wird das gemacht? Die „Hoffnung“ der SPAM-Roboter-Programmierer ist, dass Sie so in Gästebücher ihren Mist unterbringen und vor allem einen Backlink auf Ihre SPAM-URL bekommen. Der ganze Vorgang läuft automatisiert ab (SPAM-Roboter) und es erfolgt nicht wirklich eine Kontrolle, was da ausgefüllt wird. Dem Spammer ist es ja egal, wo und wieviel wirtschaftlichen Schaden er irgendwo erzeugt, solange er sich irgendwie einen Vorteil verschafft.

Für uns ergeben sich aus der Vorgehensweise 2 Informationen. Der SPAM-Roboter kontrolliert nicht das Aussehen des Formulars und ob es überhaupt Sinn macht. Und er will es so schnell wie möglich machen, da es auf Masse ankommt.

Hier haben wir 2 Ansatzpunkte, um den Spam von Spam-Robotern herauszufiltern, ohne dass wir nervige Captchas einsetzen müssen, die für Menschen oft schwieriger auszufüllen sind als von verschiedenen Spam-Robotern, die das automatisiert können.

Erster Ansatz zum Aushebeln von SPAM-Robotern: Zusatzfelder

Der Roboter analysiert die HTML-Formularfelder und sendet die vermeidlich passenden Daten. Geben wir ihm dem Spam-Roboter also Futter. Wie erstellen in unserem HTML-Formular ein weiteres Feld, was nur für den Spam-Roboter gedacht ist. Unsere menschlichen Besucher sollen dieses Feld weder sehen noch ausfüllen. Dazu blenden wir über CSS dieses Feld wieder aus (CSS wird meistens von den SPAM-Robotern nicht ausgewertet).

<span class="datenfeld"> Ihre E-Mail-Adresse
<input type="text" name="email" value="" size="50">
</span>

<span class="kontrollfeld"> Ihre Website
<input type="text" name="website" value="" size="50">
</span>
.kontrollfeld {
  display: none;
}

Kommt jetzt nach dem Absenden auch einen Eintrag im Feld website können wir mit einer hohen Wahrscheinlichkeit davon ausgehen, dass es sich um einen Eintrag von einem Spam-Roboter handelt und im Bereich der Auswertung des Formulars dann entsprechend verfahren wie z.B. der Anzeige: „Bitte wenden Sie sich an den Betreiber. Ihre Anfrage konnte leider nicht verarbeitet werden.“

Warum nur mit hoher Wahrscheinlichkeit? Wer noch Blind unterwegs ist und nicht die CSS-Anweisungen unter Umständen sieht, sind wirklich Blinde, die Informationen im Internet über Brailleschrift anzeigt bekommen bzw. von einer Software vorgelesen bekommen. Hier ist immer die Frage, wie gut diese Software ist und auch die CSS-Anweisungen auswertet. Zur Sicherheit können wir in unser Formular bei der Beschriftung des Feldes einfach dazu schreiben, dass es nicht ausgefüllt werden darf. Das gute ist, dass wir unsere Formularbeschriftung in Deutsch machen und die wenigsten SPAM-Roboter aus Deutschland stammen bzw. der deutschen Sprache mächtig sind. Unser Formular könnte also so aussehen:

<span class="datenfeld"> Ihre E-Mail-Adresse
<input type="text" name="email" value="" size="50">
</span>

<span class="kontrollfeld"> Ihre Website (Feld NICHT ausfüllen!)
<input type="text" name="website" value="" size="50">
</span>

Möchte man dies nicht oder durch weitere Verfahren das Formular gegen Spam absichern kann man den zweiten Ansatz anwenden.

Zweiter Ansatz zum Aushebeln von SPAM-Robotern: Zeit

Wir wissen, dass die Spam-Roboter so schnell wie möglich arbeiten wollen. Es geht um Masse anstelle von Klasse. Daher können wir einfach überprüfen, wie lange es dauert, dass das Formular ausgefüllt wird. Also die Zeit zwischen dem Anzeigen und dem Absenden. Jeder normale Mensch wird mindestens ein paar Sekunden benötigen, nachdem er das Formular angezeigt bekommt dieses auszufüllen. Also nehmen wir ein weiteres Feld auf, das für den Benutzer nicht sichtbar ist und den Zeitpunkt enthält, wann das Formular ausgegeben wurde.

<input type="hidden" name="kontrolle" value="<?php echo time(); ?>">
<input type="hidden" name="aktion" value="abgesendet">

Über die PHP-Funktion time() erhalten wird die vergangenen Sekunden seit dem 1.1.1970. Diese Sekunden können wir nun gegenrechnen, wenn das Formular abgesendet wurde.

Im folgenden Beispielcode gehen wir davon aus, dass unser Formular über POST abgesendet wurde.

$aktion = $_POST['aktion'] ?? '';

if ( $aktion == 'abgesendet' ) {
  // Kontrolle, ob es zeitlich passt – der aktuelle Unix-Zeitstempel 
  $zeitpunkt_aktuell = time();

  $kontrolle = $_POST['kontrolle'] ?? '';

  $zeitdauer = bcsub($zeitpunkt_aktuell, $kontrolle); 
  echo "<p>Ausfülldauer des Formulars in Sekunden: $zeitdauer </p>";

  // Annahme: wenn es länger als 2 Sekunden dauert, dann Mensch
  if ( $zeitdauer > 2 ) {
	// Felder des Formulars auswerten und weiterverarbeiten
  }
  else
  {
    // wahrscheinlich Spam-Roboter (zur Sicherheit Text ausgeben)
    echo "<p>Bitte wenden Sie sich an den Betreiber.</p>";
    echo "<p>Ihre Anfrage konnte leider nicht verarbeitet werden.</p>";
  }

}

Hier der komplette Code (die übergebene Daten werden angezeigt, aber nicht weiter verarbeitet). Wichtig ist das Prinzip:


<?php
$aktion = $_POST['aktion'] ?? '';

if ( $aktion == 'abgesendet' ) {
  // Kontrolle, ob es zeitlich passt – der aktuelle Unix-Zeitstempel
  $zeitpunkt_aktuell = time();

  $kontrolle = $_POST['kontrolle'] ?? '';

  $zeitdauer = bcsub($zeitpunkt_aktuell, $kontrolle);
  echo "<p>Ausfülldauer des Formulars in Sekunden: $zeitdauer </p>";

  // Annahme: wenn es länger als 2 Sekunden dauert, dann Mensch
  if ( $zeitdauer > 2 ) {
	// Felder des Formulars auswerten und weiterverarbeiten
		echo "<p>Formulardaten werden verarbeitet</p>";
		echo "<ul>";
		echo "<li>Nachname: ". $_POST['nachname'];
		echo "<li>URL Website: ". $_POST['website'];
		echo "</ul>";
  }
  else
  {
    // wahrscheinlich Spam-Roboter (zur Sicherheit Text ausgeben)
    echo "<p>Bitte wenden Sie sich an den Betreiber.</p>";
    echo "<p>Ihre Anfrage konnte leider nicht verarbeitet werden.</p>";
  }
}
?>
<hr>

<form action="index.php" method="post">
<p>Ihr Name:<br>
<input type="text" name="nachname">

<p>Ihre Website:<br>
<input type="text" name="website">

<p>
<input type="hidden" name="kontrolle" value="<?php echo time(); ?>">
<input type="hidden" name="aktion" value="abgesendet">

<input type="Submit" name="absenden" value="absenden">
</form>

Viel Spaß beim Testen dieser 2 Möglichkeiten, um Spam zu vermeiden. Wenn sonst nichts mehr hilft, dann kann ich das Captcha in Form einer Captcha-Clock empfehlen.

Wenn Sie einen Fehler finden, bitte mitteilen (egal ob Schreibfehler oder inhaltlicher Fehler).

Mit Maus fehlerhafte Stelle markieren und übernehmen mit folgendem Button:



(kann angegeben werden)

Nach Absenden kommt hier Feedback! Bitte nicht doppelt absenden. Danke.

Bitte unterstützen Sie dieses Projekt

Sie können dieses Projekt in verschiedenen Formen unterstützen - wir würden uns freuen und es würde uns für weitere Inhalte motivieren :).

unsere Videos bestellen

Unsere Videos und eBooks bestellen.

Spenden

Sie können uns eine Spende über PayPal zukommen lassen.

Weiterempfehlungen

Empfehlen Sie es weiter - wir freuen uns immer über Links und Facebook-Empfehlungen.

Bücher über Amazon

Bestellen Sie Bücher über folgende Links bei Amazon:

Fehler melden

Vielen Dank für Ihre Hilfe