Formulare gegen Spam etc. schützen

latitude

Mitglied
Hallo liebes Forum. Ich habe mich mal wieder an einem Formular versucht, welches eine Möglichkeit gegen den Mißbrauch in Bezug aud Spam mittels "header-injection" und "XSS" bieten soll. Da ich jedoch kein PHP Profi bin, möchte ich an dieser Stelle um Euer Feedback bitten.

hier nun das Script:

Code:
<p align="center" class="error">
<?php

//Entferne nicht gewünschte Zeichen
$entfernen = array("\r\n\r\n","\R\N\R\N",".\n",".\r","<CRLF>","<crlf>","<cr>","<CR>","<lf>","<LF>","bcc","BCC","cc","CC","from:","FROM:","to:","TO:","MIME","mime","content-type","CONTENT-TYPE","/");
$aendern = array("","","","","","","","","","","","","","","","","","","","","");

foreach($_POST as $key=>$value) $_POST[$key]=str_replace($entfernen,$aendern,$value); // \r\n und \r ändern in \n

//Wandle HTML TAGS
$firma = htmlspecialchars($_POST['firma']);
$anrede = htmlspecialchars($_POST['anrede']);
$name = htmlspecialchars($_POST['name']);
$strasse = htmlspecialchars($_POST['strasse']);
$plz = htmlspecialchars($_POST['plz']);
$telefon = htmlspecialchars($_POST['telefon']);
$email = htmlspecialchars($_POST['email']);
$betreff = htmlspecialchars($_POST['betreff']);
$nachricht = htmlspecialchars($_POST['nachricht']);
$checke = htmlspecialchars($_POST['checke']);


//Prüfe ob abgeschickt wurde
if(isset($_POST['submit']) && $checke == 423){

//Prüfung ob die Felder entsprechend ausgefüllt wurden

//Firma kein Pflichtfeld

//Anrede
if(!$anrede && empty($anrede)){echo ("Bitte wählen Sie eine Form der Anrede aus.<br>");}else{ $check1 = true;}

//Name
if(!$name && empty($name)){echo ("Bitte nennen Sie uns Ihren Namen.<br>");}else{ $check2 = true;}

//Strasse und Nummer
if(!$strasse && empty($strasse)){echo ("Bitte geben Sie einen Strassennamen mit Hausnummer an.<br>");}else{ $check3 = true;}

//PLZ und Ort
if(!$plz && empty($plz)){echo ("Bitte geben Sie Ihre Postleitzahl und den Wohnort ein.<br>");}else{ $check4 = true;}

//Telefon kein Pflichtfeld

//Prüfe Gültigkeit der eMailadresse
if(!$email){echo ("Bitte geben Sie Ihre eMailadresse an.<br>");}else{ $check5 = true;}
$checkemail = eregi( "^" .
               "[a-z0-9]+([_\\.-][a-z0-9]+)*".       //user
               "@".                    				//@ zeichen
               "([a-z0-9]+([\.-][a-z0-9]+)*)+".      //domain
         "\\.([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|nato|net|org|pro)" .    //sld, tld
               "$", $_POST['email']);
if (!$checkemail){echo "Bitte geben Sie eine korrekte Email Adresse ein.<br>";
					$mailCheck = 2;
}
else{ $mailCheck = 1;}


//Betreff
if(!$betreff && empty($betreff)){echo ("Bitte geben Sie einen Betreff an.<br>");}else{ $check6 = true;}

//Nachricht
if(!$nachricht){echo ("Wie lautet Ihre Nachricht an uns?<br>");}else{ $check7 = true;}

//Prüfe alle Errorcodes
if($check1 == true && $check2 ==true && $check3 ==true && $check4 ==true && $check5 ==true && $check6 ==true && $check7 ==true && $mailCheck == 1){

//echo "alles o.k.";

//Nicht Pflichtfelder für Empfänger erkenntlich machen.
//Telefon kein Pflichtfeld
if(!$telefon && empty($telefon)){ $telefon = "Keine Angabe!";}
//Firma kein Pflichtfeld
if(!$firma && empty($firma)){ $firma = "Keine Angabe!";}


//DATEN ABSCHICKEN
$empfaenger="empfaenger@adresse.de";

$text="Firma:
$firma

Anrede:
$anrede

Name:
$name

Strasse / Nr.:
$strasse

PLZ / Ort:
$plz

Telefon:
$telefon

eMailadresse:
$email

Nachricht:
$nachricht ";

mail($empfaenger,$betreff, $text,"From:Kontaktformular@Ihre_Webseite.de");

echo "<p align=center class=versand>Wir werden Ihre Anfrage schnellstm&ouml;glich bearbeiten und anschlie&szlig;end, wenn
von Ihnen gew&uuml;nscht, Kontakt zu Ihnen aufnehmen.</p>";

//Variablen zurücksetzen
unset($firma);
unset($anrede);
unset($name);
unset($strasse);
unset($plz);
unset($telefon);
unset($email);
unset($betreff);
unset($nachricht);
}

//schliessende Klammer der Prüfung ob das Formular abgeschickt wurde
}
?>
</p>
<form action="" method="post" name="contactMe">
<table width="560" border="0" align="center" cellpadding="3" cellspacing="0">
<tr>
<td class="txtMainBold">Firma:</td>
<td>
<input name="firma" type="text" id="firma" size="60" value="<?php if(isset($firma)){ echo $firma; }?>">
</td>
</tr>
<tr>
<td class="txtMainBold">Anrede:</td>
<td>
<p>
<label>
<input name="anrede" type="radio" value="Herr" checked>
Herr</label>
<br>
<label>
<input type="radio" name="anrede" value="Frau">
Frau</label>
</p>
</td>
</tr>
<tr>
<td width="96" class="txtMainBold">Ihr Name: </td>
<td width="452"><label>
<input name="name" type="text" id="name" size="60" value="<?php if(isset($name)){ echo $name; }?>">
</label></td>
</tr>
<tr>
<td class="txtMainBold">Strasse / Nr.: </td>
<td>
<input name="strasse" type="text" id="strasse" size="60" value="<?php if(isset($strasse)){ echo $strasse; }?>">
</td>
</tr>
<tr>
<td class="txtMainBold">PLZ / Ort: </td>
<td>
<input name="plz" type="text" id="plz" size="60" value="<?php if(isset($plz)){ echo $plz; }?>">
</td>
</tr>
<tr>
<td class="txtMainBold">eMailadresse:</td>
<td><input name="email" type="text" id="email" size="60" value="<?php if(isset($email)){ echo $email; }?>"></td>
</tr>
<tr>
<td class="txtMainBold">Telefonnummer:</td>
<td><input name="telefon" type="text" id="telefon" size="60" value="<?php if(isset($telefon)){ echo $telefon; }?>"></td>
</tr>
<tr>
<td class="txtMainBold">Betreff:</td>
<td><input name="betreff" type="text" id="betreff" size="60" value="<?php if(isset($betreff)){ echo $betreff; }?>"></td>
</tr>
<tr>
<td valign="top" class="txtMainBold">Ihre Nachricht: </td>
<td><label>
<textarea name="nachricht" cols="45" rows="5" id="nachricht" ><?php if(isset($nachricht)){ echo $nachricht; }?></textarea>
</label></td>
</tr>
<tr>
<td>
<input name="checke" type="hidden" id="checke" value="423">
</td>
<td><label>

<div align="center">
<input name="submit" type="submit" value="Abschicken">
</div>
</label></td>
</tr>
</table>
</form>
<br><br>

Aufgrund der Barrierefreiheit möchte ich auf Captchas verzichten.

Für Verbesserungsvorschläge bin ich sehr dankbar! Vielen Dank für Eure Hilfe.

Liebe Grüße
 
Zuletzt bearbeitet:
Am besten bei der Überprüfung der Inhalte von den Variablen auch $_POST benutzen:

if(!$_POST['anrede'] && empty($_POST['anrede'])...

Damit wird vermieden, dass etwas per GET-Variablen gespamt wird...


Falls Du die Daten in die mysql Datenbank schreibst würde ich folgende PHP Funktion benutzen:
mysql_real_escape_string
 
Hallo Ali,

vielen Dank für Deine Antwort.

Die Daten werden nicht in eine DB sondern als mail verschickt. Da ich dieses Formular auf mehreren Seiten einsetzen möchte, will ich sicher gehen, dass es i.O. ist.

Werde Deine Anregung einfliessen lassen.

Sonst noch Ideen oder gar Schwachpunkte entdeckt?
 
Zuletzt bearbeitet:
Was eventuell auch noch interessant sein könnte wäre eine IP-Sperre, damit Du nicht gleich 50 Mails pro Minute von einem Absender bekommst.

Da Du keine Datenbank verwendest, würde ich die IP-Adresse und "Abschick-"Uhrzeit des Besuchers in die Session speichern.

So kannst Du dann beim erneutem ausfüllen des Formulars prüfen, ob das der selbe Besucher ist und ein erneutes Abschicken für einige Zeit verhindern. (Zumindest solange er nicht sein Browserfenster schließt. Dadurch geht die Session dann verloren)

Hoffe, das hilft dir weiter...
 
Hallo Ali,

diese Variante hatte ich Anfangs auch im Visier, allerdings kommt das Formular oder eben einen Variation dessen, auf einer Landingpage zum Einsatz, wo es normal ist mehrere Anfragen zu senden. Es handelt sich hierbei um eine Landingpage mit verschiedenen Produkten. Das würde bedeuten, dass die Usability doch zu stark eingeschränkt wäre, es sei denn ich setze den Zeitrahmen relativ gering.

Nach meiner Erfahrung ist das Unterbinden von Spam aufgrund "menschlicher" Einwirkung nicht wirklich zu unterbinden.....
 
Zurück