Spam bei PHP-Kontaktformular

Wer Probleme mit Spams als Inhaber eines PHP-Kontaktformulars hat, für den ist folgender Artikel sicherlich interessant:

Mail-Injection-Artikel: http://www.mailinjection.com/solutions

Zudem biete ich hier eine Lösung an, um die im obigen Artikel beschrieben Zeilenumbrüche via RegularExpressions zu entfernen:

$_POST['E-Mail']=preg_replace( “/(content-type:|bcc:|cc:|to:|from:)/im”, “”, $_POST['E-Mail']);
if (!preg_match(‘/^[a-z0-9_\.\-]+@[a-z0-9\.\-]+\.[a-z]{2,}$/i’,$_POST['E-Mail'])) die (“Bitte geben Sie ein gültige E-Mail-Adresse ein”);

if (strstr($_POST['Betreff'], “\n”)) die (“Spamversuch blockiert”);

…..

Dabei steht \n bei PHP für eine neue Zeile. Da laut der Spezifikation RFC 2822 die einzelnen Felder durch eine neue Zeile definiert werden müssen, bleibt Spam außen vor.

Update I: http://www.drweb.de/webmaster/kontakt-formular-akismet.shtml – Vorgefertigte Lösung. Skript gibt aus, ob der Nutzer ein Spammer ist oder nicht. Je nachdem kann dann individuell darauf reagiert wernde.

Update II: Vielleicht gefällt ja dem ein oder anderen diese Version besser:

// Prüft, ob Eingabe Zeilenumbrüche enthält
function has_no_newlines($text)
{
return preg_match(“/(%0A|%0D|\\n+|\\r+)/i”, $text) == 0;
}

// Prüft, ob mehrzeilige Textangaben E-Mail-Headerangaben enthalten
function has_no_emailheaders($text)
{
return preg_match(“/(%0A|%0D|\\n+|\\r+)(content-type:|to:|cc:|bcc:)/i”, $text) == 0;
}

// Prüft, ob Angabe eine korrekt formatierte Mailadresse ist
function is_valid_email($email)
{
return preg_match(“/^[^@]+@.+\.\D{2,6}$/”, $email);
}

//Beispielanwendung
if (!has_no_newlines($email) || !has_no_emailheaders($text))
die (“Die Eingabe wurde durch den Spam-Filter beanstandet und nicht entgegen genommen.”);

if (!is_valid_email($email))
die (“Die eingegebene E-Mail-Adresse scheint ungültig zu sein”);


About this entry