Hallo
- Hab beim googlen diverse Beiträge gesehen, in denen es heißt, dass htmlspecialchars nicht mehr notwendig sei, wenn ich die Php-Datei auslagere und aus der HTML-Datei anspreche gemäß:
<form action="sendmail.php" method="post">
Stimmt das? Das hattest du (Felix) mir ja ohnehin in deiner zweiten "Version" empfohlen, wenn ich das richtig verstanden habe!?
Da hast du ihn nicht ganz richtig verstanden. Ihm ging es darum, entsprechend dem EVA-Prinzip, die HTML-Ausgabe (A von EVA) vom Rest des Skripts (E für Eingabe, V für Verarbeitung) zu trennen. Zudem würdest du mit deinem obigen Vorgehen (Aufruf eines externen Skripts) das Affenformular aufgeben.
Zu den einzelnen Schritten (bezogen auf ein Affenformular):
E für Eingabe: Die Eingabe erfolgt durch den Aufruf des Skripts.
Fall 1: Es wird einfach nur aufgerufen, es kommen also keine Daten aus dem Formular. Es wird nur der HTML-Quelltext mit leerem Formular (bzw. mit eventuell gewünschten Vorbelegungen der Formularfelder) ausgegeben.
Fall 2: Das Formular wird abgeschickt, es liegen (mehr oder minder stimmige) Eingaben vor. Sie müssen überprüft werden, womit wir zu V wie Verarbeitung kommen.
V für Verarbeitung:
Die übergebenen Werte aus dem Formular sollen bestimmten Kriterien entsprechen. Es kann aber sein, dass vollkommen nutzlose oder gar schädliche Eingaben gemacht wurden. Dies geht recht einfach. Man kopiere den HTML-Quelltext und ändere das Formular und dann den zu übergebenden Inhalt.
Beispiele für Prüfungen:
Werte müssen in einem spezifizierten Bereich liegen. Dies können numerische Bereiche (z.B. Stunden zwischen 0 und 24) sein. Es kann sich dabei aber auch um Texte handeln, die beispielsweise in den <option>
s eines <select>
s notiert sind. Solche Dinge kann man z.B. mit in_array
prüfen, wenn man die erlaubten Werte in Prüfarrays vorhält (die man auch zum skriptgesteuerten Aufbau des Formulars benutzen kann). In bestimmten Fällen prüft man gegen reguläre Ausdrücke, die bezüglich des erlaubten Wertebereichs flexibler sind.
Es kommen natürlich auch freie Texte vor. Diese kann man schlecht gegen konkrete Vorgaben prüfen. In solchen Fällen prüft man, ob die entsprechenden Werte nicht leer (was natürlich auch eine konkrete Vorgabe ist) sind, was im Falle von Pflichtfeldern zur Wiedervorlage des Formulars mit Markierung der fehlenden Eingaben führt.
Nach der Prüfung sämtlicher Eingaben muss also entschieden werden, ob alle Eingaben ihre Richtigkeit haben, was zum Versenden der Email oder auch zum Speichern der Eingaben in einer Datenbank führt, oder ob Eingaben fehlen; Folge: das Formular wird erneut aufgerufen.
Nun sind wir bei A wie Ausgabe:
Fall 1: Ausgabe des leeren Formulars
(siehe Eingabe, Fall 1)
Fall 2: Es fehlen Eingaben
Das Formular wird mit Vorbelegung jener Formularfelder, deren Eingaben bereits gültig sind und mit Markierung der Felder, deren Eingaben fehlerhaft waren bzw. fehlten, aufgerufen.
Fall 3:
Alle Eingaben sind erfolgt und die Email wurde versandt oder die Daten wurden gespeichert. Man kann nun z.B. eine Danksagung ausgeben ("Danke für blablabla, folgende Daten wurden versendet/gespeichert: .....").
All diese Aufgaben können innerhalb eines Skripts erledigt werden. Eben ein Affenformular.
Um auf deine Frage zur Maskierung zurückzukommen: Jede Ausgabetechnik erfordert eine spezielle Maskierung, da es für viele Sprachen unterschiedliche Maskierungsregeln gibt. Eine Ausnahme dürfte hierbei Plaintext sein, also das, was du auch in einem Editor schreiben würdest.
Werden nun Daten in HTML eingefügt, *müssen* diese Daten nach den Regeln von HTML maskiert werden. Genau dazu dient bei PHP htmlspecialchars
. Dabei ist es egal, welches Skript dies tut -es könnte ja z.B. mit include
in das aufgerufene Skript eingefügt worden sein- es ist nur wichtig, dass als Ausgabemedium HTML zum Einsatz kommt. Das würde z.B. dann zutreffen, wenn du dem Besucher nach dem Versand der Email die Eingaben noch einmal anzeigst. *Aber auch erst dann, wenn du das tust!*
Würdest du deine Daten aus dem Formular nach der erfolgreichen Prüfung in eine MySQL-Datenbank speichern, müsstest du die Daten bei der Übergabe nach den Regeln von MySQL maskieren, dazu gibt es in PHP die Funktion mysql_real_escape_string
. Für Anfänger verwirrende besonderheit dabei: Die Maskierung erfolgt konkret für die Übergabe der Daten an die Datenbank. *In* der Datenbank liegen die Daten dann wieder unmaskiert vor und werden bei einer eventuellen Ausgabe wieder dem Kontext entsprechend (z.B. HTML->htmlspecialchars
) maskiert.
Andere Medien würden, ihren eigenen Regeln entsprechend, andere Maskierungen erfordern.
- Ich bekomme beim Absenden des Formulars eine e-mail an meine Adresse, und das hat mich ja schon mal sehr gefreut ;-) ! Jedoch ohne Text! ...
mail("empfängermailadresse", "Betreff der mail", mailtext, "From:absender");
mailtext
ist eine Kostante, keine Variable. Wenn die Variable wirklich diesen Namen trägt, hast du nur das dem Namen vorangestellte "$" vergessen.
Tschö, Auge