Formulare

Wenn nicht gerade was geklickt wird, dann werden meistens Daten vom Benutzer eingegeben.

Diese Daten werden dann an den Server gesendet und dort weiter verarbeitet. PHP nimmt eine entscheidende Rolle im Umgang mit Formulardaten ein. Für das Erstellen von Formularen sind Kenntnisse in HTML zwingend erforderlich. Ein Formular mit einigen relevanten Eingabefeldern könnte in etwa so aussehen.

Formular.php

<!DOCTYPE html>
<html lang="de">
 <head>
  <meta charset="utf-8">
  <title>Formulare in PHP</title>
 </head>
 <body>
  <?php
   // PHP-Code
  ?>
  <form method="POST">
   <fieldset>
    <input type="radio" id="herr" name="anrede" value="Herr">
    <label for="herr">Herr</label>
    <input type="radio" id="frau" name="anrede" value="Frau">
    <label for="frau">Frau</label>
    <input type="radio" id="divers" name="anrede" value="Divers">
    <label for="divers">Divers</label> 
    <hr>
    <label for="vorname">Vorname:</label>
    <input type="text"id="vorname"name="vorname">
    <br />
    <label for="nachname">Nachname:</label>
    <input type="text"id="nachname"name="nachname">
    <br />
    <label for="email">Email-Adresse:</label>
    <input type="email"id="email"name="email">
    <hr>
    <label>Anzahl Reisende:
     <select name="anzahl">
      <option value="0">Anzahl wählen</option>
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
      <option value="4">4</option>
     </select>
    </label>
    <br />
    <label>Urlaubstyp:
     <select name="typ[]" size="5" multiple="multiple">
      <option value="strand">Strandurlaub</option>
      <option value="wandern">Wanderurlaub</option>
      <option value="ski">Skiurlaub</option>
      <option value="erleben">Erlebnisurlaub</option>
      <option value="wellness">Wellnessurlaub</option>
     </select>
    </label>
    <hr>
    <label for="bemerkung">Bemerkung:</label>
    <textarea cols="50" rows="4" name="bemerkung"></textarea>
    <hr>
    <input type="checkbox" name="agb" value="ok">
    <label for="agb">Ich akzeptiere die AGB.</label>
    <br />
    <input type="submit" name="submit" value="Jetzt Buchen">
   </fieldset>
  </form>
 </body>
</html>

Das Ergebnis sollte im Browser in etwa so aussehen:

Formular im Webbrowser

Was passiert, wenn ein Formular versenden wird? Im HTML-Element <form> legen wir über das Attribut "method" fest, wie wir die Daten versenden werden. Hierfür gibt es die beiden Möglichkeiten: "GET" und "POST"

Anfragemethode im HTTP-Protokoll

<form method="GET">

Formulardaten werden als einfaches Name-Wert-Paar an die URL angehangen.

Anfragemethode im HTTP-Protokoll

<form method="POST">

Die Daten werden auch in Name-Wert-Paare umgewandelt, aber die Übertragung erfolgt im "Body" der http-Anfrage. Damit stehen diese nicht in der URL. Sollte kein Attribut angegeben sein, wird vom Browser automatisch "GET" verwendet. Beide Varianten haben Ihre Vor- und Nachteile.


Textfelder

Der Wert des Textfeldes steht in der superglobalen Variable.

Werte auslesen

$_POST["Feldname"]
// bzw.
$_GET["Feldname"]

Damit ist er für uns leicht auszulesen. Zuerst speichern wir uns den Wert des Textfeldes in eine eigene Variable. Den Wert dieser Variable lassen wir uns im Browser ausgeben.

Werte auslesen

$vorname = $_POST["vorname"];
echo "Vorname: $vorname";

Nachdem ein Name im Formular eingetragen wurde, wird er im Browser ausgegeben. Auch wenn in dem Feld nichts eingegeben wurde, ist die Variable immer gesetzt. Die Überprüfung mit "isset" können wir uns dadurch zwar sparen, aber der gute Stil sieht nun mal eine Überprüfung vor.

Werte überprüfen

$vorname = $_POST["vorname"];
if (isset($_POST["vorname"])) {
 echo "Vorname: $vorname";
} else {
 echo "Vorname: Kein gültiger Name angegeben.";
}

Solange das Ergebnis "true" ist, wird der Vorname ausgegeben, auch wenn es sich um einen leeren String handelt. Mit solch einfachen Dingen wie leere Strings in Formularen können unter Umständen Fehlermeldungen erzeugt werden, die für Angreifer interessante Details ausgeben. Formularfelder sind immer wieder der Einstiegspunkt für Angreifer. Ein kleines Beispiel zeigt, wie einfach ein Angriff möglich ist. In dem Eingabefeld für den Vornamen schreiben wir kein Name, sondern ein Script-Tag mit JavaScript Code.

JavaScript-Anweisung

<script>alert('Hallo');</script> 

Wenn wir jetzt das Formular abschicken, wird der JavaScript Code ausgeführt. Es erscheint ein kleines Fenster mit dem Hinweis: Hallo. Erst nachdem der JavaScript-Code ausgeführt wurde, wird mit dem PHP-Code fortgesetzt. Das war ein kleiner Angriff, der weitreichende Folgen haben kann. Um solche Angriffe zu unterdrücken, verwenden wir die "htmlspecialchars"-Funktion von PHP. Dadurch werden die HTML-Typische Sonderzeichen in Entities umgewandelt und führen keinen Schadcode mehr aus, sondern geben uns die Zeichenfolge als Vorname aus.

Sonderzeichen umwandeln

$vorname = $_POST["vorname"];
if (isset($_POST["vorname"])) {
 $vorname = htmlspecialchars($vorname);
 echo "Vorname: $vorname";
} else {
 echo "Vorname: Kein gültiger Name angegeben.";
}

Angreifer können auch durch Manipulationen der HTTP-Anfrage Fehlermeldungen provozieren oder sogar erreichen, dass die Variable "$_POST["vorname"]" ein Array ist, auf dem "htmlspecialchars" nicht angewendet werden kann. Hier lohnt es sich zu prüfen, ob es sich bei der Variable um ein String handelt.

Datentyp von Variable überprüfen

$vorname = $_POST["vorname"];
if (isset($_POST["vorname"]) && is_string($_POST["vorname"])) {
 $vorname = htmlspecialchars($vorname);
 echo "Vorname: $vorname";
} else {
 echo "Vorname: Kein gültiger Name angegeben.";
}

Für den Fall der Fälle wollen wir uns aber nicht ausgeben lassen, dass kein gültiger Name angegeben wurde. Vielmehr soll die Variable einen leeren String erhalten, um eventuellen Schadcode aus der Variabel zu entfernen.

Leerer String als Variable bei fehlerhafter Eingabe

} else {
   $vorname = "";
}

Zusammengefasst sagt das Skript Folgendes aus. Es wird geprüft, ob das Eingabefeld mit dem Namen "vorname" Daten übertragen hat und ob es sich dabei um einen String handelt. Sollte beides Zutreffen werden eventuelle HTML-Sonderzeichen umgewandelt und der Wert der Variable wird ausgegeben. Das Ganze können wir aber noch etwas eleganter schreiben, indem wir den Konditionalen Operator (?) verwenden.

Eingabe überprüfen und verarbeiten

$vorname = (isset($_POST["vorname"]) && is_string($_POST["vorname"])) ? $_POST["vorname"] : "";
$vorname = htmlspecialchars($vorname);
echo "Vorname: $vorname";

Insgesamt können wir diesen Code auf alle Textfelder anwenden.

Textfelder

$vorname = (isset($_POST["vorname"]) && is_string($_POST["vorname"])) ? $_POST["vorname"] : "";
$nachname = (isset($_POST["nachname"]) && is_string($_POST["nachname"])) ? $_POST["nachname"] : "";
$email = (isset($_POST["email"]) && is_string($_POST["email"])) ? $_POST["email"] : "";
$bemerkung = (isset($_POST["bemerkung"]) && is_string($_POST["bemerkung"])) ? $_POST["bemerkung"] : "";
$vorname = htmlspecialchars($vorname);
$nachname = htmlspecialchars($nachname);
$email = htmlspecialchars($email);
$bemerkung = htmlspecialchars($bemerkung);
echo "<b>Vorname: </b>$vorname<br />";
echo "<b>Nachname: </b>$nachname<br />";
echo "<b>Email-Adresse: </b>$email<br />";
echo "<b>Bemerkung: </b>$bemerkung<br />";

Die Formulare bestehen ja bekanntlich nicht nur aus Textfeldern, sondern auch aus Radiobuttons, Checkboxen oder Auswahllisten. Den Umgang mit diesen Werten und die Prüfung gegen reguläre Ausdrücke können wir im weiteren Verlauf genauso betrachten wie die fehlerhaften Eingaben und eine entsprechende Information für den User, um auf die fehlerhafte Eingabe aufmerksam zu machen. Ärgerlich, wenn ein Benutzer auf der Webseite mehrere Minuten damit beschäftigt ist, ein Formular auszufüllen und nach dem Absenden wegen eines Fehlers das gesamte Formular zurückgesetzt wird. Hier können wir als Entwickler gegenlenken und die korrekt ausgefüllten Felder mit den vom Benutzer getätigten Eingaben vorausfüllen.


Weiter mit Cookies