Tag Archives: php

So können Sie mit PHP Kontaktformulare vor Spam schützen

Kontaktformulare sind auf fast jeder Homepage eingerichtet, leider werden die Kontaktformulare häufig missbraucht. Der Grund ist hierfür oft eine unsichere Programmierung, die einfach ohne Überprüfung der Eingabe eine E-Mail sendet.

Hier gibt es kleine Lösungen, um Missbrauch zu vermeiden:

Ein Bot verwendet immer BB-Codes, obwohl das Kontaktformular keinen BB-Code Editor hat.

Dies kann so verhindert werden:
if(stristr($nachricht,"[link=") || stristr($nachricht,"[url=") || stristr($nachricht,"a href=")){
echo "Bitte kein BB-Code verwenden.";
}

Formulare werden per POST oder GET übertragen, per Log konnte ich vestellen das auch GET-Werte an die URL angehängt wurden.

Sollte Ihr Formular nur per POST übertragen, können Sie sich z.B. so schützen:
if(count($_GET)>0){
//Spamfalle: Formular sendet nichts per GET sondern POST
exit("Wegen Spam-verdacht abgelehnt (GET)");
}

Mit Count wird das Array $_GET gezählt, dies sollte 0 sein, da wir ja kein GET verwenden.
Anders rum geht es natürlich auch, wenn kein POST verwendet wird:

if(count($_POST)>0){
//Spamfalle: Formular sendet nichts per GET sondern POST
exit("Wegen Spam-verdacht abgelehnt (GET)");
}

Zeitdauer für das Ausfüllen und Absenden des Formulars:
Eine Maschine ist wesentlich schneller als ein Mensch, dies kann man sich zu nutze machen.
Wird ein Formular unter 10 Sek. ausgefüllt, kann man davon ausgehen, dass dies kein Mensch war.

Zum Formular einen neuen versteckten Button hinzufügen:
echo '<input name="time" type="hidden" value="'.time().'" />';

Wird das Formular auf der Webseite jetzt aufgerufen, steht im Button ein aktueller Timestamp (Zeitstempel), wir wissen also wann das Formular geladen wurde.

if ( isset($_POST['time']) && is_numeric($_POST['time'])) {
$posted = intval($_POST['time']);
$sendezeit = (time() - $posted);
if ($sendezeit < 10 || $sendezeit > 36000) {
echo "Mail kann gesendet werden";
}
else {
echo "Wegen Spamverdacht abgelehnt!";
}
}

Bots sind dumm, nutzen Sie dies aus:
Spambots füllen alle Felder eines Formulars aus, selbst wenn Sie nicht zu sehen sind.

<input style="display: none;" title="Homepage eintragen" name="webseite" type="text" />
<input style="display: none;" title="E-Mail eintragen" name="email" type="text" />

CSS display:none sagt, dass dieses Feld nicht erscheinen soll, es ist also nur noch im Quelltext.
Bots sehen aber nur den Quelltext, Grafiken, Javascripte und Videos können nicht bzw. sehr schlecht ausgewertet werden.

Jetzt muss nur geprüft werden, ob hier auch nichts drin steht:
if(!empty($_POST['webseite']) || !empty($_POST['email'])){
exit("Spam!");
}
else {
echo "kein Spam";
}

Überprüfen der Syntax von E-Mail-Adressen:
E-Mail Adressen sollten auf Gültigkeit überprüft werden, z.B. gehört in jede e-mail Adresse auch ein at-zeichen (@), punkt, tld,…

if ( ! preg_match('/^[a-z0-9_\.\-]+@[a-z0-9\.\-]+\.[a-z]{2,}$/i', $_POST['email']) ) die ("Die E-Mail adresse ist ungültig!");

Entfernen Sie alle „Cc:“ (Carbon copy) oder „Bcc:“ (Blind Carbon Copy) aus Ihrer Variablen:
Mit PHP können Sie es so erreichen:

$absender = preg_replace( "/(content-type:|bcc:|cc:|to:|from:)/im", "", $_POST['absender'] );
$nachricht = preg_replace( "/(content-type:|bcc:|cc:|to:|from:)/im", "", $_POST['nachricht'] );
$betreff = preg_replace( "/(content-type:|bcc:|cc:|to:|from:)/im", "", $_POST['betreff']);
$nachname = preg_replace( "/(content-type:|bcc:|cc:|to:|from:)/im", "", $_POST['nachname']);
$vorname = preg_replace( "/(content-type:|bcc:|cc:|to:|from:)/im", "", $_POST['vorname']);
$telnr = preg_replace( "/(content-type:|bcc:|cc:|to:|from:)/im", "", $_POST['telnr']);

Überprüfen Sie auch die Gültigkeit der E-Mail Adresse vom Absender:
if(!ereg("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,6})$",$Absender))
{
echo "Sie haben keine richtige E-Mail Adresse eingegeben!";
}

Anmerkung:
Oft werden auch CAPTCHA und Rechenaufgaben im Formular verwendet, davon kann ich nur abraten. Captcha sind oft sehr schlecht zu lesen und Rechenaufgaben lösen kann ein Bot auch. Das einzige was man damit erreicht, ist seinen Besucher zu verärgern.