Moin!
Ich geh mal auf das ein, was mir seltsam vorkommt:
$tname = trim($_POST['name']);
$tnachricht = trim($_POST['nachricht']);
if ((isset($_POST['name']) && empty($tname)) || (isset($_POST['nachricht']) && empty($tnachricht)))
Das ist widersinnig. Wenn $_POST['name'] nicht isset ist, dann fliegt dir bei error_reporting E_ALL die Zuweisung an $tname bzw. $tnachricht um die Ohren.
Und zweitens: Wenn schon die Zuweisung an neue Variablen, warum dann nicht auch isset auf diese anwenden?
else if (isset($_POST['submit']) && $_POST['submit'] == 'eintragen')
Da du vor dem else die Verarbeitung des Skriptes komplett abbrichst und einen Redirect aussprichst, ist das else sowieso nicht mehr notwendig. Spart dir Klammerebenen ein, zumindest aber logische Abhängigkeiten, die keine sind. Und das hier ist keine.
Zu bemängeln ist, dass die getätigten Eingaben im Formular bei der Fehlermeldung komplett verloren gehen. Bei einem Namen ist das sicher nicht so schlimm (wenn der Kommentar fehlt), umgekehrt aber schon. Mache ein Affenformular da hin!
if(!eregi('^([a-z0-9.\_-]+)@([a-zäöü0-9.-]+.[a-z]{2,6})$',$email))
Naja, über die Sinnhaftigkeit einfacher regulärer Ausdrücke zur Prüfung von EMail-Adressen wurde hier (auch von mir) schon viel geschrieben. Dein Versuch, die neuen Umlautdomains zu berücksichtigen, kann nur als halbherzig gewertet werden. "äöü" sind nur drei von insgesamt über 50 neuen Zeichen, die in .de, .at und .ch neu in Domainnamen vorkommen dürfen. Weltweit sind allerdings grundsätzlich die meisten Unicode-Buchstaben erlaubt (insbesondere Chinesisch - deswegen gibts doch den ganzen Zirkus überhaupt) - real hängt der Umfang von den Bedingungen der TLD-Verwalter ab! Damit hat sich ein regulärer Ausdruck sowieso erledigt, weil du kaum alle Bedingungen immer auf dem aktuellen Stand halten kannst - geschweige denn sie recherchieren.
Deshalb mein guter Rat: Eine Mailadresse, der man von überall her schreiben kann, besteht aus: Mindestens einem Zeichen, einem @, mindestens einem Zeichen, einem Punkt, und mindestens zwei Zeichen, die kein Punkt sind. Oder in Kurz: In der Mailadresse kommt ein @ und danach mindestens ein Punkt vor, alles andere ist garantiert keine gültige Mailadresse. Und alles, was durchkommt, kann auch falsch sein, aber ohne dass du weitere Realitätsprüfungen (Befragen des DNS-Systems, Kontakten des angeblichen Mailservers, Versandversuch einer Mail an den Empfänger) durchführst, wirst du sowieso keine nennenswerte Verbesserung der Eingaben erzielen.
Und noch ein weiteres Problem tritt auf: Eigentlich müsstest du die Maildomain mit Sonderzeichen auch noch Punycode-codieren und dann gucken, ob da eine gültige normale Domain bei rauskommt. Denn es gibt tatsächlich Domains mit ungültigen Sonderzeichen. Das "ß" beispielsweise wird im Codierungsprozess zu "ss" - und das Resultat ist: Es gibt keine Domain "www.weiß.de" und auch kein Punycode-Äquivalent "www.xn-weiss.de", weil sie "www.weiss.de" entsprechen muß.
Die Problematik der Code-Injection hat dir der Gästebuchterminator schon verdeutlicht - dazu nur eine Anmerkung: strip_tags() ist KEINE vernünftige Alternative zu htmlspecialchars(). strip_tags() löscht je nach Problemfall entweder zuwenig (böse und gefährlich!) oder zuviel (böse und ärgerlich!).
- Sven Rautenberg