PHP Kontaktformular überprüfen

  • Hallo,


    gibt es in PHP die Möglichkeit, dass bei einer fehlerhaften Eingaben in einem HTML Formular die eingetragenen Werte nicht verschwinden?

  • Einmal hast du die Möglichkeit das Formular über Ajax abzusenden, dann bleibt dein DOM erhalten, oder wenn du das Formular im Fehlerfall renderst, kannst du den Parameter value="" mit den eingegebenen Werten bestücken.


    Nebst der ersten Variante kannst du die Eingaben auch über JavaScript zusätzlich validieren, und den Nutzer vom Senden abhalten.

  • Nebst der ersten Variante kannst du die Eingaben auch über JavaScript zusätzlich validieren, und den Nutzer vom Senden abhalten.

    Kann man natürlich machen, ist auch gut so. :)


    Aber ein Hinweis für OP: die endgültige Eingabevalidierung muss immer im Backend stattfinden. Niemals auf Javascript verlassen!

    https://www.reddit.com/r/Progr…javascript_for_html_form/

    "Denn der radikalste Zweifel ist der Vater der Erkenntnis."

    -Max Weber

  • […] oder wenn du das Formular im Fehlerfall renderst, kannst du den Parameter value="" mit den eingegebenen Werten bestücken.

    Und bitte nicht darauf vergessen, die Nutzeingaben bei der Ausgabe durch htmlspecialchars() oder htmlentities() zu jagen! Bei Template-Engines gibt es dafür oftmals vordefinierte Filter.

    "Wer nur noch Enten sieht, hat die Kontrolle über seine Server verloren." (Netzentenfund)

  • Sorry wenn ich hier deinen Thread kurz kapere @Georg


    Ich habe selbst ein PHP Kontaktformular, welches dann entsprechend eine über SMTP eine E-Mail weiterschickt.


    Das Skript selbst kriegt seine Daten über ein Post Request beim Ausfüllen der Form.

    Jetzt ist mir gerade ein Gedanke bzgl. Sicherheit gekommen, den ich mir nicht erklären konnte.

    Was hindert potenzielle Angreifer daran, mein Skript zum Versenden von Spam zu missbrauchen?

    Es müsste doch lediglich ein Post-Request gefälscht werden und an dasd Skript weitergereicht werden.

    Ich müsste doch daher irgendwie in PHP prüfen, ob denn das Post-Request legitim ist, z.B. ob der Referrer meine Domain ist.

    Oder denke ich hier falsch?


    Würde mich über Tipps/Ideen freuen.

  • Den Referrer kannst du an sich auch spoofen...


    Da hilft nur sowas wie ein Captcha, was du dir davor baust. Vorzugsweise natürlich nicht den Google Bullshit - da gibt es sicher genug bessere Lösungen. Das muss ja grundsätzlich erstmal nichts hochkomplexes sein.

    "Denn der radikalste Zweifel ist der Vater der Erkenntnis."

    -Max Weber

  • Ich müsste doch daher irgendwie in PHP prüfen, ob denn das Post-Request legitim ist, z.B. ob der Referrer meine Domain ist.

    Oder denke ich hier falsch?


    Würde mich über Tipps/Ideen freuen.

    Ja, du denkst hier falsch.


    Zunächst einmal sollte das Kontaktformular an eine E-Mail Adresse gehen und nicht an: entscheide selbst wohin.

    Ebenfalls sollte das FROM Feld statisch gesetzt sein und nicht aus deinem Formular stammen.

    Das verhindert Backscatter-Spam.


    Dann solltest du die Input Felder auf Plausibilität checken, sodass in den Feldern tatsächlich das steht, was du erwartest. Hier benutzt man RegEx für.

    Dann solltest du eine gescheite SMTP Bibliothek nutzen. Wenn du nur die PHP mail() Funktion aufrufst, kann dir ganz schnell passieren, dass dir jemand einen weiteren Header einschleußt, z.B. einen neuen To-Header, dann hat der Versender Kontrolle über deinen SMTP Server und kann Spam versenden.


    Hier eignen sich PHPMailer oder SwiftMailer.

    Wenn es irgendwie möglich ist, würde ich aber auf Kontaktformulare verzichten. Wer etwas von dir will, kann dir doch eine E-Mail schicken.

    Als E-Mail Nutzer bist du da nämlich auf der rechtssicheren Seite - immerhin kann ich nachgucken, was ich dir gesendet habe und ob dein Mailserver das angenommen hat. Beim Kontaktformular geht das eher nicht. Hier könnte man auf die Idee kommen, dem Absender einfach eine Kopie des Formulars zu senden, aber dann hast du wieder eine Spamschleuder.


    Ich denke Kontaktformulare sind einfach nicht mehr zeitgemäß, und es hat sowieso keiner Lust die Dinger auszufüllen.


    Just my 5 cents.

  • Evtl. tut es ja auch eine Speicherung "auf der Website" (= in einer Datenbank), wo du dann drauf zugreifen kannst. Und ggf. z.B. einen Cronjob der dich bei neuen Nachrichten immer zur vollen Stunde über die benachrichtigt.


    Ich denke da irgendwie ein bisschen an sowas, wie der Betreiber vom Privacy Handbuch das gelöst hat. (https://privacy-handbuch.de/autoren.htm)

    "Denn der radikalste Zweifel ist der Vater der Erkenntnis."

    -Max Weber

  • Danke für den ganzen Input bisher, das hat mir auf jeden Fall schon sehr geholfen :)

    Ob das Kontaktformular noch zeitgemäß ist, steht natürlich auf einem anderen Blatt geschrieben.

    Aufgrund von Lernzwecken würde ich euch gerne trotzdem nochmal um Rat bzgl. serverseitiger Validierung der Usereingaben bitten.


    Ich habe mir jetzt ein Script mit PHPMailer zusammengebastelt, welches den Userinput prüft und dementsprechend dann eine E-Mail schickt (siehe Anhang).

    Nach meinem aktuellen (recht vagen) Kenntnisstand sollten solche Plausibilitätschecks in zwei Schritten erfolgen:

    1. Escape

    2. Validate


    Dazu werden mit der Funktion escapedata() sämtliche Whitespaces und Backslashes entfernt sowie alle Specialchars in Entities umgewandelt. Mit validate() wird dann noch die Länge der Parameter überprüft.


    Jetzt folgende Fragen:

    1. Sind solche Checks ausreichend, um ein gesundes Maß an Sicherheit zu erreichen? Was ist eurer Meinung nach ausreichend, bzw. wie geht ihr hier vor?

    2. Könnte ich mir den Aufruf von htmlspecialchars() nicht sparen? Die Mail sende ich ja nicht im HTML-Format, wodurch die große Gefahr ja schonmal gebannt sein müsste. Wenn ein User im Formular nun aber z.B. < oder > nutzt, wird die Mail auch zusätzlich noch schwer lesbar.



    Herzlichen Dank schonmal für eure Zeit :)


    contact.php.txt