Marco: Sehr viel Spam von Kontaktformular

Hallo zusammen

Ich  habe eine kleine Frage und zwar habe ich ein Kontaktformular auf verschidenen Seiten (von mir und von Kunden) welches ich in PHP geschrieben habe (siehe unten).

Nun erhalten die Kunden sehr viel Spam. Was kann ich dagegen tun?
Muss ich wirklich ein Feld einbauen wo man aus einer Grafik einen Code abschreiben muss um das Formular zu senden? Denke nicht das es
wirklich eine kundenfreundliche Lösung ist.

Was ich mich frage, hat mein PHP Script einen Fehler und es wird so für das Versenden oder macht sich wirklich jemand die Mühe und senden das Formular mit dem betätigen des OK-Button?

Hier mal das Script:

***************************

<?

//Formular spamsicher machen

function has_no_newlines($text)
{
   return preg_match("/(%0A|%0D|\n+|\r+)/i", $text);
}
//Pflichtfelder überprüfen
if (has_no_newlines($_POST['name'])) { include ("mailwrong.php");
echo "wrong!";
exit;
 }
if (has_no_newlines($_POST['email'])) { include ("mailwrong.php");
echo "wrong!";
exit;
 }
if (has_no_newlines($_POST['vorname'])) { include ("mailwrong.php");
echo "wrong!";
exit;
 }

// E-Mailadresse überprüfen ob sie gültig ist
if(!ereg("^([a-zA-Z0-9._-]+)@([a-zA-Z0-9.-]+.[A-Za-z][A-Za-z]+)$", $_POST['email'])) {

include ("mailadresse_wrong.php");
exit;
}

//Pflichtfelder überprüfen

if($_POST['name'] == "" or $_POST['email'] =="" or $_POST['kommentar'] =="")
{
include ("mailwrong.php");
exit;
}

//Aktuelle Zeit ermitteln

$zeitstempel = time ();
$zeit = date("H-"."i-"."s", $zeitstempel);

//Datum in Variablen schreibe
$tag    = date("d "); //aktueller Tag auslesen
$monat  = date("n");  //aktueller Monat
$jahr   = date(" Y"); //aktuelles Jahr

$monatde = array("Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"); //Umwandeln von Englisch in Deutsch
$datum  = $tag.$monatde[$monat-1].$jahr;

//E-Mail versenden

$EMail    =  "info@xxx.ch";
$titel    =  "Bemerkungen/Anfrage";

$mitteilung .= "Firma:".$_POST['name']."\n\n";
$mitteilung .= "Name:" .$_POST['vorname']."\n\n";
$mitteilung .= "Strasse: ".$_POST['strasse']."\n\n";
$mitteilung .= "PLZ/Ort: ".$_POST['plz']."\n\n";
$mitteilung .= "Telefon: ".$_POST['telefon']."\n\n";
$mitteilung .= "E-Mail: ".$_POST['email']."\n\n";
$mitteilung .= "Nachricht: ".$_POST['kommentar']."\n\n";

$mitteilung .= "--------------------------------------------------------------------------------------------------------\n";
$mitteilung .= "Die Nachricht wurde am "."$datum"." um "."$zeit"." Uhr"." gesendet\n";
$mitteilung .= "--------------------------------------------------------------------------------------------------------\n";

$header =  "From:$name<$email>\r\n".
   "Reply-To: $email\n".
   "X-Mailer: ".phpversion()."\n".
   "X-Priority: 1\n".
   "SMail-Priority: high";

$bool = mail($EMail, $titel, $mitteilung, $header);

include ("mailok.php");

?>

********************************

Kann mir jemand sagen, was ich besser machen kann oder hat jemand Tips damit ich endlich weniger Spam von diesen Formularen erhalte.

Freue mich riesig auf Eure Antworten und danke schon im voraus für Eure Hilfe!

Gruss Marco

  1. Moin,

    Kann mir jemand sagen, was ich besser machen kann oder hat jemand Tips damit ich endlich weniger Spam von diesen Formularen erhalte.

    Alles was Du machen musst, ist zu verhindern, das eine Mail _automatisch_ abgeschickt werden kann. Ein Captcha ist nur _eine_ Möglichkeit von mehreren. Welche auch hier bereits wiederholt angesprochen wurden.
    Versteckte Eingabefelder;
    Zeitnahme-> wenn das Aufüllen kürzer dauert als x sec. dann wird es wohl ein Bot gewesen sein;
    Zwangsvorschau und und und...
    Bisher habe ich über mein Mailformular jedanfalls noch nicht eine Spammail bekommen, auch ohne Captcha.

    mit freundlichen Grüßen
    Ulrich

    --
    Teiltransparente Bereiche
    selfcode: sh:| br:> ie:% mo:) va:) de:] zu:) fl:( ss:| ls:[
    um-fritz.de
    1. Hallo Ulrich

      Das mit der "Vorschau" klingt gut d.h. ich mache einfach nach dem OK klicken einen zusammenzug der Eingaben und man muss dann nochmals auf OK klicken. Meinst Du, dass kann ein Bot dann nicht?

      Auf das Captcha möchte ich falls möglich verzichten.

      Ansonsten ist am PHP nichts falsch oder?

      Marco

      1. Schreibe beim Laden der Seite time() in ein verstecktes Formular. Beim Senden überprüfst du, wieviel zeit verstrichen ist. Bei zu kleinen Abständen meckerst du (oder dein Script).
        Auch kannst du bei jedem Laden der Seite den Namen des Submit-Buttons ändern.

        1. Hallo Manko10

          Danke für die gute Idee. Hast Du evt. gerade ein kleines Beispielscript zur Hand wie Du das machst? Gibts Erfahrungswerte wieviel Zeit etwas verstrichen werden bei einem normalen Formular?

          Was mich noch interessiert. Wenn ich den Namen des Submit-Buttons änder was genau bringt das? Arbeiten diese Bots mit dem Namen d.h. wird da nicht richtig auf den Buttion geklickt?

          Marco

          1. Hallo!
            Der Bot bekommt den Namen eines Formularelements und fängt dann bei dem an zu spammen. Noch mehr Effekt hättest du, wenn du einen zufälligen Namen für das Textfeld generieren würdest (den musst du natürlich zur späteren Verarbeitung bspw. in ein verstecktes Forumlarfeld schreiben). Das würde den Bot ziemlich durcheiander bringen.
            Ein Beispielscript habe ich jetzt auf die Schnelle nicht zur Hand.

            Als Erfahrungswert würde ich 10-15 Sekunden vorraussetzen. Ich würde auch noch die Zeit, die zwischen zwei Beiträgen verstreichen muss, auf 20 Sekunden setzen.

          2. Tipp am Rande.
            Da deine URL jetzt von Spam-Bots belagert wird, empfiehlt es sich, die URL des geänderten Scripts zu ändern, damit Spambots lediglich ein 404 erhalten und nicht den Server unnötig belasten.
            Erfahrung zeigt, dass die Frequenz extrem zunehmen wird, unabhängig davon ob das Script erreichbar ist oder nicht.
            Ein 404 ist hier die performanteste Lösung.

          3. Danke für die gute Idee. Hast Du evt. gerade ein kleines Beispielscript zur Hand wie Du das machst?

            Dr Web zeigt einen gut beschriebenen Ansatz in der Artikelreihe »Sichere Formulare«

            Viele Grüße!
            _ds

            --
            In der Stadt die Uhrzeit einer britischen Touristengruppe aufgeschnappt und gewundert, dass deren Uhren auf Helsinki-Zeit standen.
            Das kleine Seitenschwein, Embarquement 19H10
  2. Hi!

    Wie heißt dein Script?
    Solche Scripte werden oftmals von Bots mit Hilfe von Suchmaschinen gefunden.
    Wenn dein Script nicht kontakt.php, kontaktformular.php oder ähnlich heißt, dann bist du schonmal ein klitzekleines bißchen sicherer.
    Gleiches gilt für die Formularfelder mit den typischen Namen: "Name", "Vorname", "Email", ...
    Ich habe ab und zu schon Erfolg damit gehabt, indem ich mein Script einfach deinemeinung.php genannt und die Formularfelder in "feld1", "feld2", ... umbenannt habe.

    Aber wenn das nicht helfen sollte, mußt du dir natürlich besseres einfallen lassen.
    Captchas bekämpfen zwar wirkungsvoll den Spam, bringen aber auch schwerwiegende Nachteile mit sich, wie ich finde.
    User mit Textbrowsern oder Sehbehinderte mit Screenreadern sind hier aufgeschmissen.
    Das möchte ich ungern in Kauf nehmen und verzichte deswegen immer auf Captchas (sofern dies nicht der Kundenwunsch ist).

    Ich gehe daher meist andere Wege.
    Eine Möglichkeit wäre es, eine kleine Zeitprüfung einzubauen.
    Der normale, menschliche User benötigt einige Zeit so ein Formular auszufüllen, während ein Bot dieses in weniger als einer Sekunde ausfüllt und abschickt.
    Baue eine kleine Prüfung ein und nimm nur Eingaben an, wenn zwischen Generierung des Formulars und dem Abschicken mehr als z.B. 2 oder 3 Sekunden vergangen sind.
    Alles andere ignorierst du dann - oder gibst eventuell auch einen Hinweis aus.
    Das hat bei mir oftmals gut geholfen, den Spam unter Kontrolle zu bringen.

    Schöner Gruß,
    rob