Formvalidierung mit Php

Formularvalidierung mit PHP

  • Thorsten Kiesch
  • Blog

Generell unterscheidet man zwischen einer clientseitigen und einer serverseitigen Validierung. Um eine Eingabemaske möglichst gut abzusichern und dennoch benutzerfreundlich zu gestalten, sollten stets beide Arten verwendet werden. Eine clientseitige Validierung stellt für keinen Angreifer eine echte Hürde dar, weswegen eine serverseitige Überprüfung der Eingabe in puncto Sicherheit durch nichts zu ersetzen ist. Jedoch sollten wir gerade im Hinblick auf Schnelligkeit, Bedienkomfort und Benutzerfreundlichkeit versuchen, eine möglichst umfangreiche clientseitige Validierung zu implementieren.

Clientseitige Validierung

Die clientseitige Validierung wird direkt durch den Browser durchgeführt, bevor die Daten zu einem Webserver gesendet werden. Im Folgenden sind die wichtigsten vorgefertigten HTML5-Funktionen dazu aufgelistet:

Input Types

Der erste Schritt zu einem optimalen Formularaufbau ist die Verwendung möglichst präziser und passender HTML Input Types. Während wir beispielsweise für die Abfrage einer E-Mailadresse den Type email nutzen können, bietet sich für die Abfrage einer konkreten Zahl meist eher der Type number an.

<input type="text" name="test">
<input type="email" name="mail">
<input type="number" name="zahl">
<input type="password" name="passwort">
Abbildung 1

Pflichtfelder

Oftmals gibt es in einem Formular einerseits Felder, die nur optional auszufüllen sind und andererseits Felder mit einer zwingend erforderlichen Eingabe. Für solche Pflichtfelder nutzen wir das Attribut required.

<input type="text" name="test" required>
Abbildung 2

Prüfung der Länge

Wenn wir genau wissen, wie lang der Inhalt einer Eingabe mindestens sein muss bzw. maximal sein darf, ist die Beschränkung auf die Länge der Eingabe eine einfache Möglichkeit der Validierung. Für Inputfelder und Textareas nutzen wir hier die Attribute minlength und maxlength. Beim Input Type number gibt es allerdings eine Ausnahme. Hier heißen die Attribute min und max, mit denen wir die kleinst- und die größtmögliche Zahl angeben können.

<input type="text" name="vorname" minlength="3" maxlength="30">
<input type="number" name="alter" min="1" max="99" step="1">
Abbildung 3

Reguläre Ausdrücke

Eine Möglichkeit, unsere Eingaben noch spezifischer abzufragen, ist der Einsatz regulärer Ausdrücke (regular expressions). Einen sogenannten Regex fügen wir in das Attribut pattern ein und dieser definiert dann möglichst genau, wie eine Eingabe auszusehen hat.

<input type="url" name="website" pattern="https?://.+">
Abbildung 4

Eine umfangreichere und individuell anpassbare clientseitige Formularvalidierung kann zudem durch den Einsatz von JavaScript erzeugt werden. Wie das am Beispiel von Vue.js mit Vuelidate aussieht, findest du hier.

Serverseitige Validierung

Wichtiger als die Datenüberprüfung über den Browser ist jedoch die serverseitige Validierung, bei der alle Daten, die an den Webserver gesendet werden, dort nochmals überprüft werden sollten, bevor sie in irgendeiner Art und Weise weiterverarbeitet werden. Grundsätzlich sollten wir mindestens das, was bereits auf der Clientseite genutzt wird, hier nochmal auf anderer Ebene einer gründlichen Prüfung unterziehen. Im Folgenden werden einige Möglichkeiten zur Prüfung erläutert:

Types

Zu jeder übermittelten Eingabe eines Felds können wir überprüfen, ob dieses auch dem gewünschten bzw. zu erwartenden Datentyp entspricht.

PHP-Funktion Beschreibung
is_numeric() ctype_digit()
(Überprüfung, ob eine Variable auch wirklich nur aus Ziffern besteht. Für den Wert -20 würde is_numeric beispielsweise true zurück liefern, während c_type_digit hier false liefert.)
Prüfung auf numerische Werte
is_int() filter_var($data, FILTER_VALIDATE_INT)
(is_int prüft, ob die übergebene Variable vom Typ Integer ist, während FILTER_VALIDATE_INT zusätzlich auch checkt, ob ein übergebener String in einen validen Integer umgewandelt werden kann.)
Prüfung auf Datentyp Integer
is_float() filter_var($data, FILTER_VALIDATE_FLOAT) Prüfung auf Datentyp Float
is_bool() filter_var($data, FILTER_VALIDATE_BOOLEAN) Prüfung auf Datentyp Boolean
is_string() Prüfung auf Datentyp String
is_object () Prüfung auf Datentyp Object
is_array() Prüfung auf Datentyp Array
checkdate() Prüfung, ob Datum gültig ist

Daten casten

Neben der reinen Überprüfung des Datentyps können wir Variablen auch direkt in den gewünschten Typ umwandeln. Mit der Funktion gettype() erhalten wir den Datentyp einer Variablen und mit settype() können wir diesen setzen. Bei dem sogenannten „Casten“ von Daten können wir aber auch gezielt eine der folgenden Funktionen nutzen:

PHP-Funktion Beschreibung
intval() (int) $data Umwandlung zu einem Integer
floatval() (float) $data Umwandlung zu einem Float
boolval() (bool) $data Umwandlung zu einem Boolean
strval() (string) data Umwandlung zu einem String
(array) $data Umwandlung zu einem Array
(object) $data Umwandlung zu einem Object

Pflichtfelder

Bevor wir mit der Verarbeitung von Formulardaten beginnen, sollten wir zunächst schauen, ob alle erforderlichen Pflichtangaben auch getätigt wurden. Dabei werden gerne die Funktionen isset(), empty() und is_null() genutzt. Im PHP Manual gibt es eine hilfreiche Übersicht, welche der Funktionen in welchen Fällen true oder false zurückgibt.

   if(isset($_POST['data'], $_POST['data2'])){
    // ... Verarbeitung starten
 }
Abbildung 5

Prüfung der Länge

Die Länge einer Variablen lässt sich mit strlen() überprüfen. In manchen Fällen kann es vielleicht sogar sinnvoll sein, die übermittelten Daten mit der Funktion substr() direkt auf die gewünschte Maximallänge zu kürzen.

   // Überprüfung auf die Länge
 if(strlen($data) < 3 || strlen($data) > 30){
    echo "Die Länge der Eingabe ist fehlerhaft.";
 }

 // Abschneiden der Eingabe
 $data2 = substr($data2, 0, 30);
Abbildung 6

Reguläre Ausdrücke

Mit der Funktion strstr() können wir prüfen, ob ein bestimmter String in der Variablen enthalten ist. Vielseitiger ist diese Prüfung jedoch noch, wenn wir mit der Funktion preg_match() genau den Pattern, den wir bereits clientseitig genutzt haben, hier nochmal auf der Serverseite prüfen.

    // Überprüfung eines Stringvorkommens
 if(strstr($_POST['url'], 'https://') == false){
    echo "Fehlerhafte URL";
 }

 // Überprüfung mittels regulärem Ausdruck
 preg_match('(\b[0-9]{2}.[0-9]{2}.[0-9]{4}\b)', $_POST['datum'], $matches);
 if(empty($matches)){    
    echo "Fehlerhaftes Datumsformat";
 }
Abbildung 7

White-/ Blacklisting

Des Weiteren haben wir die Möglichkeit, bestimmte Werte per se zu verbieten (Blacklisting), indem wir diese beispielsweise in einem Array speichern und mit der Funktion in_array() überprüfen, ob der übergebene Wert mit einem des Arrays übereinstimmt. Besser und sicherer ist es allerdings, dass wir nur die Werte durchlassen, die explizit zugelassen sind (Whitelisting).

Weitere nützliche Funktionen

PHP-Funktion Beschreibung
strip_tags() Entfernung aller HTML- und PHP-Zeichen aus einer Variablen.
trim() Entfernung von Leerzeichen (oder anderen Zeichen) am Anfang und Ende der Variablen
str_replace() Austausch definierter Zeichenketten
htmlspecialchars() Umwandlung von Sonderzeichen in HTML-Code
mysqli_real_escape_string () Maskieren von Daten zum Eintrag in eine Datenbank
quotemeta() Escapen von Metazeichen (. \ + * ? [ ^ ] ( $ ))
urlencode() / urldecode() URL-Kodierungen

Fazit

Zusammenfassend lässt sich also sagen, dass wir bei jedem Formular mehrere Filter- und Validierungsmöglichkeiten haben. Je mehr wir davon nutzen können, desto besser und sicherer gestaltet sich die Interaktion zwischen einem Benutzer und der Website. Bevor wir ein Formular ausspielen, sollten wir dieses stets gründlich und ausgiebig testen. Gerade dann bietet es sich an, absichtlich fehlerhafte Werte einzutragen, um mögliche Schwachstellen herauszufinden. Natürlich gibt es aber neben der reinen Validierung der Daten noch eine ganze Reihe weiterer Möglichkeiten, die zur Erhöhung der Sicherheit beitragen. Wichtig ist zudem eine stimmige Basis. Daher empfiehlt es sich, direkt auf bestimmte PHP Frameworks wie Laravel, Symfony etc. zu setzen, welche eine Formularhandhabung bereits inkludiert haben.

forms, validation, php

Thorsten Team EURESA
Autor: Thorsten Kiesch  
Webentwicklung & IT
Der Wirtschaftsinformatiker ist bei EURESA für die Weiterentwicklung des hauseigenen Intranets und – damit einhergehend – technische Optimierung interner Prozesse verantwortlich. Seine Spezialgebiete sind PHP-Skripte, Datenbanken und die Programmiersprache Javascript.

Php

Datenbanken

Javascript

Adresse


EURESA Consulting GmbH
Graf-Siegfried-Straße 6
54439 Saarburg