//Gib Fehler und Warnungen aus error_reporting(E_ALL); //Deutschsprachige Umgebung, damit die //regulären Ausdrücke auch Umlaute etc. erkennen setlocale(LC_ALL, 'de_DE'); //Erzeuge einen zufällig aussehenden Zugangscode aus dem Datum ... $code = chr((date("y") + 7) % 10 + date("m") + 68 + (date("m") % 2) * 32) . chr((date("d") + (date("d") %2)) / 2 + 66 + (37 * (date("d") %2))); //... den der Anwender mittels verborgenem Eingabefeld übergibt. //So lässt sich das Gros der skriptgesteuerten Angriffe von //vornherein abblocken. //Wurde das Formular abgeschickt? //Falls ja: Daten prüfen und versenden if(isset($_POST['los'])) { if(!isset($_POST['code']) || $_POST['code'] != $code) die('Mailcode fehlt!'); //Liste der zu überprüfenden Formularfelder: //'absender' muss genau eine Mailadresse sein, //'betreff' ist ein mindestens drei Zeichen langer Text ohne Umbruch, //'text' muss zehn Zeichen lang sein. $pruefung = array( 'name' => '/^([A-Za-z])[a-z]+(([ -])([A-Za-z])[a-z]+)*$/', 'absender' => '/^ [\w.!#%&\*\/=\?\^\`\{\|\}\~+-]{1,64} \@ [[:alnum:].-]{1,255} \. [a-z]{2,6} $/xi', //prüft auf gültige E-Mail-Adresse nach RFC 2822, //erlaubt auch ungewöhnliche Adressen wie "{@heise.de"; //strengere Prüfung (erfordert z.B. mindestens 2 Zeichen vor @ //und im Domainnamen, schließt ungewöhnliche Adressen aus): //'absender' => '/^[\w.+-]{2,64}\@[\w.-]{2,255}\.[a-z]{2,6}$/', 'betreff' => '/^[[:print:]]{3,}$/', //restriktivere Variante: //'betreff' => '/^[[:alnum:]\s\?.!,;:\(\)\/\"-]{3,}$/', 'text' => '/^[[:print:][:space:]]{10,}$/' ); //Durchlaufe alle Formulardaten: foreach($_POST as $parameter => $wert) { //Formularfelder, die in $pruefung stehen, //müssen in die oben definierten Muster passen if(isset($pruefung[$parameter])) { if(!preg_match($pruefung[$parameter], $wert)) die('Probleme mit Feld ' . $parameter . ': ' . $wert); } else { //Der Rest wird weggeworfen. unset($_POST[$parameter]); } }