decocode decocode deco    

Formulare auswerten #

Die Auswertung von Formularen ist wohl neben der Anbindung von Datenbanken einer der häufigsten Anwendungsbereiche von PHP. Formulareingaben können auf Richtigkeit und Vollständigkeit überprüft werden, und im Zweifelsfall wird eine Fehlermeldung ausgegeben. Die Angaben können dann z. B. für eine automatische E-Mail oder als Datenbankeintrag weiterverarbeitet werden. PHP kann eben viel mehr als nur dynamisch HTML erzeugen.

Über das Verhindern des unbeabsichtigten erneuten Absendens von Formulardaten siehe Seite ›Reload von Formularen verhindern‹.

Wie man mit den Eingaben in Formularen nun in der Praxis umgeht, darum soll es in diesem Abschnitt gehen. Zunächst schreiben wir in unsere PHP-Datei formular.php folgenden Code (auf die HTML-Struktur wurde wie bei den meisten Beispielen zu Gunsten der Übersichtlichkeit verzichtet):

Quelltext auswählen
1
2
3
4
5
6
7
8
9
<?php
  echo "<form accept-charset='utf-8' action='formular.php' method='post'><dl>\r\n";
  echo "<dt><label for='name'>Name:</label></dt><dd><input type='text' maxlength='100' name='name' id='name'></dd>\r\n";
  echo "<dt><label for='alter'>Alter:</label></dt><dd><input type='text' maxlength='3' name='alter' id='alter'></dd>\r\n";
  echo "<dt><label for='status'>Verheiratet:</label></dt><dd><input type='checkbox' name='status' id='status'></dd>\r\n";
  echo "<dt><label for='kinder'>Kinderzahl:</label></dt><dd><input type='text' maxlength='3' id='kinder' name='kinder'></dd>\r\n";
  echo "<dt><label for='kommentar'>Kommentar:</label></dt><dd><textarea cols='30' rows='10' id='kommentar' name='kommentar'></textarea></dd>\r\n";
  echo "</dl><div><input type='submit' name='senden' value='abschicken'></div></form>\r\n";
?>

Wenn man nun diese Datei im Verzeichnis var/www/my_website/ abspeichert und dann im Browser die Adresse http://localhost/my_website/formular.php aufruft, sieht man das Resultat: ein einfaches Formular, das auf eine Eingabe wartet.

Im Attribut form wurde als Ziel der Formulardaten ebenfalls die Datei formular.php angegeben und als Übertragungsmethode post. Alle Daten des Formulars (einschließlich des submit-Buttons) werden nun nach dem Absenden in dem globalen Array $_POST gespeichert und können dort ausgelesen werden, wobei die Indizes der Werte des Arrays den Namen der entsprechenden Formularfelder entsprechen (Attribut name). Das Auslesen geschieht z. B. auf folgende Weise:

Quelltext auswählen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
  if ($_POST['senden']) {
    $name = $_POST['name'];
    $alter = $_POST['alter'];
    $status = $_POST['status'];
    if ($status) $status = "verheiratet"; else $status = "ledig";
    $kinder = $_POST['kinder'];
    $kommentar = $_POST['kommentar'];
    $ausgabe = "<b>Ihre Daten:</b><br><br>Name: ".$name."<br>Alter: ".$alter." Jahre<br>Familienstand: ".$status."<br>Kinder: ".$kinder."<br>Kommentar:<br>".nl2br($kommentar);
    echo $ausgabe;
    echo "<br><br><a href='formular.php'>neue Eingabe</a>";
  } else {
    echo "<form accept-charset='utf-8' action='formular.php' method='post'><dl>\r\n";
    echo "<dt><label for='name'>Name:</label></dt><dd><input type='text' maxlength='100' name='name' id='name'></dd>\r\n";
    echo "<dt><label for='alter'>Alter:</label></dt><dd><input type='text' maxlength='3' name='alter' id='alter'></dd>\r\n";
    echo "<dt><label for='status'>Verheiratet:</label></dt><dd><input type='checkbox' name='status' id='status'></dd>\r\n";
    echo "<dt><label for='kinder'>Kinderzahl:</label></dt><dd><input type='text' maxlength='3' id='kinder' name='kinder'></dd>\r\n";
    echo "<dt><label for='kommentar'>Kommentar:</label></dt><dd><textarea cols='30' rows='10' id='kommentar' name='kommentar'></textarea></dd>\r\n";
    echo "</dl><div><input type='submit' name='senden' value='abschicken'></div></form>\r\n";
  }
?>

Zunächst wird das Array $_POST nach dem Wert von senden (der ›abschicken‹-Button) abgefragt. Wurde der Button betätigt, hat die Variable den Wert 1, ansonsten 0. Der Wert 1 führt zur Verarbeitung der Eingaben. Wurde der Button nicht betätigt, wird das Eingabeformular angezeigt.

Man beachte, dass die Zeilenumbrüche der Ausgabe des Textfeldes kommentar mit der Funktion nl2br() in HTML-Zeilenumbrüche (<br>) umgewandelt werden müssen!

Bei Formularen ist es besonders wichtig, fehlende und ungültige Eingaben zu filtern. Daher wird man eine Funktion einbauen wollen, die solche Eingaben mit einer Fehlermeldung quittiert:

Quelltext auswählen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
  if ($_POST['senden']) {
    $name = trim($_POST['name']);
    if (!$name) $error[0] = " <span style='color:red;'>Es wurde kein Name eingegeben!</span>";
    $alter = str_replace(",",".",trim($_POST['alter']));
    if (!is_numeric($alter)) $error[1] = " <span style='color:red;'>Nur Zahlenwerte sind zulässig!</span>";
    elseif ($alter != floor($alter)) $error[1] = " <span style='color:red;'>Nur Ganzzahlen sind zulässig!</span>";
    elseif ($alter < 0 || $alter > 130) $error[1] = " <span style='color:red;'>Dies ist ein unrealistisches Alter!</span>";
    if (!$alter) $error[1] = " <span style='color:red;'>Es wurde kein Alter eingegeben!</span>";
    $status = $_POST['status'];
    if ($status) $status = "verheiratet"; else $status = "ledig";
    $kinder = str_replace(",",".",trim($_POST['kinder']));
    if (!is_numeric($kinder)) $error[2] = " <span style='color:red;'>Nur Zahlenwerte sind zulässig!</span>";
    elseif ($kinder != floor($kinder)) $error[2] = " <span style='color:red;'>Nur Ganzzahlen sind zulässig!</span>";
    elseif ($kinder < 0) $error[2] = " <span style='color:red;'>Dies ist eine unrealistische Kinderzahl!</span>";
    if ($kinder == "") $error[2] = " <span style='color:red;'>Es wurde keine Kinderzahl eingegeben!</span>";
    $kommentar = trim($_POST['kommentar']);
    if (!$error) {
      $ausgabe = "<b>Ihre Daten:</b><br><br>Name: ".$name."<br>Alter: ".$alter." Jahre<br>Familienstand: ".$status."<br>Kinder: ".$kinder."<br>Kommentar:<br>".nl2br($kommentar);
      echo $ausgabe;
      echo "<br><br><a href='formular.php'>neue Eingabe</a>";
    }
  }
  if (!$_POST['senden'] || $error) {
    echo "<form accept-charset='utf-8' action='formular.php' method='post'><dl>\r\n";
    echo "<dt><label for='name'>Name:</label></dt><dd><input type='text' maxlength='100' name='name' id='name' value='".$name."'>".$error[0]."</dd>\r\n";
    echo "<dt><label for='alter'>Alter:</label></dt><dd><input type='text' maxlength='3' name='alter' id='alter' value='".$alter."'>".$error[1]."</dd>\r\n";
    if ($status == "verheiratet") $checked = " checked='checked'";
    echo "<dt><label for='status'>Verheiratet:</label></dt><dd><input type='checkbox' name='status' id='status'".$checked."></dd>\r\n";
    echo "<dt><label for='kinder'>Kinderzahl:</label></dt><dd><input type='text' maxlength='3' id='kinder' name='kinder' value='".$kinder."'>".$error[2]."</dd>\r\n";
    echo "<dt><label for='kommentar'>Kommentar:</label></dt><dd><textarea cols='30' rows='10' id='kommentar' name='kommentar'>".$kommentar."</textarea></dd>\r\n";
    echo "</dl><div><input type='submit' name='senden' value='abschicken'></div></form>\r\n";
  }
?>

Die Angaben werden nun vor der Ausgabe überprüft. Im Fehlerfall wird eine Fehlermeldung in das Array error geschrieben. Die Existenz dieses Arrays wird dann abgefragt, und im Fehlerfall wird das Eingabeformular mit den Fehlermeldungen angezeigt. Ist kein Fehler aufgetreten, werden die Eingaben aufgelistet.

Die Funktion trim() bewirkt die Löschung aller Leerzeichen, die sich vor oder nach einem eingegebenen Text befinden. So wird unter anderem verhindert, dass nur Leerzeichen eingegeben werden, was technisch zwar eine gültige Eingabe darstellen würde, logisch aber nicht.

Die Funktion str_replace(",",".",$string) ersetzt das Komma als Dezimalzeichen , gegen den Punkt ., da nur dies für Bruchzahlen zulässig ist. In diesem Beispiel sind zwar ohnehin nur Ganzzahlen sinnvoll, zur Veranschaulichung wurde diese Funktion aber eingesetzt.

Die Funktion is_numeric() überprüft, ob ein Wert eine Zahl ist. Im Beispiel sind nicht numerische Werte (also z. B. Buchstaben) für die Variablen alter und kinder unlogisch.

Die Funktion floor() rundet eine numerische Variable auf ihren ganzzahligen Wert ab, so kann überprüft werden, ob eine Dezimalzahl eingegeben wurde. Eine Überprüfung mit is_int() funktioniert hier nicht, da die Inhalte von $_POST immer Zeichenketten sind.

Negative Zahlenwerte machen hier natürlich auch keinen Sinn, daher wurden diese gefiltert.

Während bei den Variablen name und alter die Existenz der Eingabe mit if ($string) erfolgte, kann dies bei kinder nicht angewendet werden, da hier der Wert 0 zulässig ist. Die Bedingung innerhalb der Klammern nach if muss immer true (wahr) sein, also 1. Der Zahlenwert 0 würde false (unwahr) entsprechen. Daher wird in diesem Fall statt dessen abgefragt, ob der Wert eine leere Zeichenkette ("") ist. Genaugenommen müssten die Variablen name und alter auf die gleiche Weise abgefragt werden, doch sind Zahlenwerte einschließlich 0 hier unlogisch und werden hier als ›keine Angabe‹ gewertet.

Schließlich werden im Fehlerfall die bereits gemachten Angaben im neu angezeigten Eingabeformular wieder automatisch eingetragen, damit der Benutzer diese nicht wiederholen muss und eventuelle Fehler nachvollziehen kann.

Besonderheiten im Zeichensatz #

Nachdem die Eingaben nun überprüft wurden, gibt es noch ein paar Besonderheiten bezüglich bestimmter Sonderzeichen zu beachten. Zwar unterstützt die Zeichenkodierung UTF-8 so ziemlich alle Zeichen der Welt, doch gibt es ein paar Steuerzeichen, die nicht unmaskiert im HTML-Quelltext auftauchen dürfen. Dies sind das kaufmännische ›Und‹ &, die so genannten Anführungszeichen " und ' sowie die Tag-Klammern < und >. Um diese Zeichen korrekt zu maskieren, verwendet man die Funktion htmlspecialchars(). Dies betrifft hier die Ausgabe der Werte der Variablen name und kommentar im Formular und in der Liste. Diese Funktion wird im PHP Handbuch beschrieben. Zusätzlich wird die Angabe ENT_QUOTES sowie die Zeichenkodierung 'UTF-8' angegeben.

Wird die Zeichenkodierung ISO-8859-1 verwendet, muss html_entities() verwendet werden! Die folgenden Beispiele beziehen sich also nur auf die Zeichenkodierung UTF-8.

Das Skript unten veranschaulicht die Wirkung von htmlentities() ohne und mit Angabe des Zeichensatzes, wenn ›exotische‹ Sonderzeichen verwendet werden.

Quelltext auswählen
1
2
3
4
<?php
  $string = "ÝÄËÏÖÜŸÃÑÕÅÆØÅ’úÿþç¿¡";
  echo htmlentities($string, ENT_QUOTES)."<br>".htmlentities($string, ENT_QUOTES, 'UTF-8');
?>

Ohne die Angabe von 'UTF-8' wird als Zeichensatz ISO-8859-1 angenommen, worin aber die Sonderzeichen nicht enthalten sind.

Das führt nun zu folgendem Skript für unser Formular:

Quelltext auswählen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
  header("content-type: text/html; charset=utf-8");
  if ($_POST['senden']) {
    $name = trim($_POST['name']);
    if (!$name) $error[0] = " <span style='color:red;'>Es wurde kein Name eingegeben!</span>";
    $alter = str_replace(",",".",trim($_POST['alter']));
    if (!is_numeric($alter)) $error[1] = " <span style='color:red;'>Nur Zahlenwerte sind zulässig!</span>";
    elseif ($alter != floor($alter)) $error[1] = " <span style='color:red;'>Nur Ganzzahlen sind zulässig!</span>";
    elseif ($alter < 0 || $alter > 130) $error[1] = " <span style='color:red;'>Dies ist ein unrealistisches Alter!</span>";
    if (!$alter) $error[1] = " <span style='color:red;'>Es wurde kein Alter eingegeben!</span>";
    $status = $_POST['status'];
    if ($status) $status = "verheiratet"; else $status = "ledig";
    $kinder = str_replace(",",".",trim($_POST['kinder']));
    if (!is_numeric($kinder)) $error[2] = " <span style='color:red;'>Nur Zahlenwerte sind zulässig!</span>";
    elseif ($kinder != floor($kinder)) $error[2] = " <span style='color:red;'>Nur Ganzzahlen sind zulässig!</span>";
    elseif ($kinder < 0) $error[2] = " <span style='color:red;'>Dies ist eine unrealistische Kinderzahl!</span>";
    if ($kinder == "") $error[2] = " <span style='color:red;'>Es wurde keine Kinderzahl eingegeben!</span>";
    $kommentar = trim($_POST['kommentar']);
    if (!$error) {
      $ausgabe = "<b>Ihre Daten:</b><br><br>Name: ".htmlspecialchars($name, ENT_QUOTES, 'UTF-8')."<br>Alter: ".$alter." Jahre<br>Familienstand: ".$status."<br>Kinder: ".$kinder."<br>Kommentar:<br>".nl2br(htmlspecialchars($kommentar, ENT_QUOTES, 'UTF-8'));
      echo $ausgabe;
      echo "<br><br><a href='formular.php'>neue Eingabe</a>";
    }
  }
  if (!$_POST['senden'] || $error) {
    echo "<form accept-charset='utf-8' action='formular.php' method='post'><dl>\r\n";
    echo "<dt><label for='name'>Name:</label></dt><dd><input type='text' maxlength='100' name='name' id='name' value='".htmlspecialchars($name, ENT_QUOTES, 'UTF-8')."'>".$error[0]."</dd>\r\n";
    echo "<dt><label for='alter'>Alter:</label></dt><dd><input type='text' maxlength='3' name='alter' id='alter' value='".htmlspecialchars($alter, ENT_QUOTES, 'UTF-8')."'>".$error[1]."</dd>\r\n";
    if ($status == "verheiratet") $checked = " checked='checked'";
    echo "<dt><label for='status'>Verheiratet:</label></dt><dd><input type='checkbox' name='status' id='status'".$checked."></dd>\r\n";
    echo "<dt><label for='kinder'>Kinderzahl:</label></dt><dd><input type='text' maxlength='3' id='kinder' name='kinder' value='".htmlspecialchars($kinder, ENT_QUOTES, 'UTF-8')."'>".$error[2]."</dd>\r\n";
    echo "<dt><label for='kommentar'>Kommentar:</label></dt><dd><textarea cols='30' rows='10' id='kommentar' name='kommentar'>".htmlspecialchars($kommentar, ENT_QUOTES, 'UTF-8')."</textarea></dd>\r\n";
    echo "</dl><div><input type='submit' name='senden' value='abschicken'></div></form>\r\n";
  }
?>

Obwohl die Werte für Alter und Kinderzahl in den Zeilen 28 und 31 von numerischem Typ sein müssten, kann es dennoch bei einer ungültigen Eingabe notwendig sein, die Funktion htmlspecialchars() anzuwenden.

Man beachte die Funktion header() am Anfang des Skiptes. Sollte es Probleme mit den erwähnten Sonderzeichen geben (eventuell, weil ein anderer Zeichensatz serverseitig eingestellt ist, unbedingt testen!), muss diese Funktion ganz am Anfang eines Skriptes eingefügt werden, bevor noch irgendwelcher HTML-Code erzeugt wurde!

Escape-Zeichen löschen #

Weiterhin bereiten unter Umständen die so genannten Anführungszeichen " und ' sowie der Backslash \ Schwierigkeiten, da diesen Zeichen bei der Übermittlung durch POST und GET das Escape-Zeichen \ vorangestellt wird, wenn das PHP-Modul mit der Einstellung magic_quotes_gpc=on (s. PHP Manual) konfiguriert wurde, womit man bei PHP-Installationen vor Version 5.3.0 rechnen muss. Das folgende Skript verdeutlicht die Wirkung:

Quelltext auswählen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
  header("content-type: text/html; charset=utf-8");
  function stripmq($str) {
    if (ini_get('magic_quotes_gpc')) $str = stripslashes($str);
    return $str;
  }
  $eingabe = stripmq($_POST['eingabe']);
  $eingabe = htmlspecialchars($eingabe, ENT_QUOTES, 'UTF-8');
  echo "<p>magic_quotes_gpc = ".$mq."</p>\r\n";
  echo "<form accept-charset='utf-8' action='test.php' method='post'>\r\n";
  echo "<input type='text' name='eingabe' value='".$eingabe."'> <input type='submit' value='abschicken'>\r\n";
  echo "</form>\r\n";
  echo "<p><samp>\$_POST['eingabe'] = ".$_POST['eingabe']."</samp></p>\r\n";
  echo "<p><samp>stripslashes(\$_POST['eingabe']) = ".stripslashes($_POST['eingabe'])."</samp></p>";
?>

Die Funktion stripmq() überprüft die Einstellung von magic_quotes_gpc und entfernt bei Bedarf die \-Zeichen. Diese Funktion sollte man nun auf alle gesendeten POST-Variablen anwenden, die möglicherweise Anführungszeichen oder Backslash enthalten können.

Quelltext auswählen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
  header("content-type: text/html; charset=utf-8");
  function stripmq($str) {
    if (ini_get('magic_quotes_gpc')) $str = stripslashes($str);
    return $str;
  }
  if ($_POST['senden']) {
    $name = stripmq(trim($_POST['name']));
    if (!$name) $error[0] = " <span style='color:red;'>Es wurde kein Name eingegeben!</span>";
    $alter = stripmq(str_replace(",",".",trim($_POST['alter'])));
    if (!is_numeric($alter)) $error[1] = " <span style='color:red;'>Nur Zahlenwerte sind zulässig!</span>";
    elseif ($alter != floor($alter)) $error[1] = " <span style='color:red;'>Nur Ganzzahlen sind zulässig!</span>";
    elseif ($alter < 0 || $alter > 130) $error[1] = " <span style='color:red;'>Dies ist ein unrealistisches Alter!</span>";
    if (!$alter) $error[1] = " <span style='color:red;'>Es wurde kein Alter eingegeben!</span>";
    $status = $_POST['status'];
    if ($status) $status = "verheiratet"; else $status = "ledig";
    $kinder = stripmq(str_replace(",",".",trim($_POST['kinder'])));
    if (!is_numeric($kinder)) $error[2] = " <span style='color:red;'>Nur Zahlenwerte sind zulässig!</span>";
    elseif ($kinder != floor($kinder)) $error[2] = " <span style='color:red;'>Nur Ganzzahlen sind zulässig!</span>";
    elseif ($kinder < 0) $error[2] = " <span style='color:red;'>Dies ist eine unrealistische Kinderzahl!</span>";
    if ($kinder == "") $error[2] = " <span style='color:red;'>Es wurde keine Kinderzahl eingegeben!</span>";
    $kommentar = stripmq(trim($_POST['kommentar']));
    if (!$error) {
      $ausgabe = "<b>Ihre Daten:</b><br><br>Name: ".htmlspecialchars($name, ENT_QUOTES, 'UTF-8')."<br>Alter: ".$alter." Jahre<br>Familienstand: ".$status."<br>Kinder: ".$kinder."<br>Kommentar:<br>".nl2br(htmlspecialchars($kommentar, ENT_QUOTES, 'UTF-8'));
      echo $ausgabe;
      echo "<br><br><a href='formular.php'>neue Eingabe</a>";
    }
  }
  if (!$_POST['senden'] || $error) {
    echo "<form accept-charset='utf-8' action='formular.php' method='post'><dl>\r\n";
    echo "<dt><label for='name'>Name:</label></dt><dd><input type='text' maxlength='100' name='name' id='name' value='".htmlspecialchars($name, ENT_QUOTES, 'UTF-8')."'>".$error[0]."</dd>\r\n";
    echo "<dt><label for='alter'>Alter:</label></dt><dd><input type='text' maxlength='3' name='alter' id='alter' value='".htmlspecialchars($alter, ENT_QUOTES, 'UTF-8')."'>".$error[1]."</dd>\r\n";
    if ($status == "verheiratet") $checked = " checked='checked'";
    echo "<dt><label for='status'>Verheiratet:</label></dt><dd><input type='checkbox' name='status' id='status'".$checked."></dd>\r\n";
    echo "<dt><label for='kinder'>Kinderzahl:</label></dt><dd><input type='text' maxlength='3' id='kinder' name='kinder' value='".htmlspecialchars($kinder, ENT_QUOTES, 'UTF-8')."'>".$error[2]."</dd>\r\n";
    echo "<dt><label for='kommentar'>Kommentar:</label></dt><dd><textarea cols='30' rows='10' id='kommentar' name='kommentar'>".htmlspecialchars($kommentar, ENT_QUOTES, 'UTF-8')."</textarea></dd>\r\n";
    echo "</dl><div><input type='submit' name='senden' value='abschicken'></div></form>\r\n";
  }
?>

Schutz vor externen Einträgen #

Im obigen Beispiel werden die Formulareingaben an das selbe Skript gesendet, in dem auch das Formular enthalten ist. Ebenso kann das Ziel des Formulars eine andere Datei sein, die nicht einmal zum selben Webprojekt gehören muss. So kann man z. B. auf der eigenen Website eine Google-Suche einbauen:

Quelltext auswählen
1
2
3
<form action='http://www.google.de/search'>
  <input type='text' name='q'> <input type='submit' value='Google Suche'>
</form>

Dieses kleine Skript bewirkt nun folgendes Formular:


Wie man hier sehen kann, ist es nicht besonders schwer, Formulareingaben an eine entfernte Website zu schicken. Diese Möglichkeit kann nun z. B. dazu missbraucht werden, Webformulare automatisiert mit Daten zu bombardieren.

Eine einfache und allerdings auch nicht ganz hundertprozentige Methode, ein Formular davor zu schützen, besteht in der Überprüfung des so genannten Referrers, also der Datei, von der aus eine andere Seite aufgerufen wurde. Für das Beispielformular auf dieser Seite geschieht das z. B. durch Einfügen folgender Zeilen:

Quelltext auswählen
1
2
3
4
5
  $self = "http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF'];
  $referrer = substr($_SERVER['HTTP_REFERER'], 0, strlen($self));
  if ($_POST['senden'] && $referrer == $self) {
    …
  }

In der Variable $self wird der Pfad der Seite gespeichert, von der die Formulareingaben stammen sollen (in diesem Fall wie gesagt die gleiche Seite, die auch das Formular auswertet). In der Variable $referrer wird dagegen die Seite gespeichert, von der aus auf die Formularauswertung zugegriffen wurde.

Mit der Bedingung $referrer == $self wird nun überprüft, ob Ursprungsseite und Zielseite übereinstimmen. Erst dann wird das Formular ausgewertet.

Natürlich kann man als Werte für die Variablen $self und $referrer auch feste Angaben wie z. B. http://www.meinewebsite.tv/formular.php?query=12 o. ä. angeben.

In diesem Beispiel wurde die Bestimmung der URLs so gewählt, dass eventuell enthaltene Query-Strings entfernt werden, um zu verhindern, dass eine Eingabe ungewollt abgelehnt wird, nur weil sich in dem URL eine Query befunden hat.

Die Schwäche dieses Skripts besteht nun darin, dass die Information über die Ursprungsseite, die sich dann in der Variable $_SERVER['HTTP_REFERER'] befindet, vom Browser des Benutzers gesendet wird und dort unter Umständen auch gefälscht worden sein kann.

E-Mail-Adresse validieren #

Enthält ein Formular ein Eingabefeld für eine E-Mail-Adresse, wird es eine echte Herausforderung, die Gültigkeit dieser Eingabe zu überprüfen. Dave Child hat dazu diese Funktion entwickelt:

Quelltext auswählen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  function check_email_address($email) {
    if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) return false;
    $email_array = explode("@", $email);
    $local_array = explode(".", $email_array[0]);
    for ($i = 0; $i < sizeof($local_array); $i++)
      if (!ereg("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$", $local_array[$i])) return false;
    if (!ereg("^\[?[0-9\.]+\]?$", $email_array[1])) {
      $domain_array = explode(".", $email_array[1]);
      if (sizeof($domain_array) < 2) return false;
      for ($i = 0; $i < sizeof($domain_array); $i++)
        if (!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$", $domain_array[$i])) return false;
    }
    return true;
  }

  if (!check_email_address($adresse)) echo "Die E-Mail-Adresse ist ungültig!";