Daten filtern und Benutzereingaben überprüfen
In PHP gibt es seit 5.1 die Filter-Erweiterungen (siehe http://www.php.net/manual/en/ref.filter.php ). Diese können, falls nicht vorhanden, über den PECL-Installer nachinstalliert werden:
$ pecl install pecl/filter
Zum Nachsehen, ob die Filter aktiv sind, entweder per PHP-INFO();
oder einfach per PHP-Programm überprüfen:
if (function_exists('filter_list'))
{
// filter-Erweiterung ist vorhanden
}
else
{
die('Abbruch: Filter-Erweiterung ist nicht vorhanden');
}
3 Wege zum Filtern von Daten
VALIDATE zum Testen, ob die Daten exakt dem Format entsprechen, das man erwartet. Die Filter werden dann mit FILTER_VALIDATE_* angesprochen.
SANITIZE zum „Heilen“ der Benutzereingaben. Dies kann, muss aber nicht zum gewünschten Ergebnis führen. Siehe dazu später das Beispiel mit E-Mail-Adressen. Die Filter werden mit FILTER_SANITIZE_* angesprochen.
FLAGS für weitere Optionen, die bei den Filtern gesetzt werden können. Diese werden mit FILTER_FLAG_* angesprochen.
Beispiel Aufbau des Aufrufs
Soll nun eine Eingabe überprüft werden, ob es sich um eine korrekte E-Mail-Adresse handelt, sieht der Aufbau folgend aus:
$mail = 'hier123asdiowqr.de';
$test_mail = filter_var($mail, FILTER_VALIDATE_EMAIL);
if ($test_mail === false)
{
echo "ist keine E-Mail-Adresse";
}
else
{
echo "formal korrekte E-Mail-Adresse.";
}
Bei der Überprüfung durch den Filter filter_var wird TRUE bzw. FALSE gesetzt, je nachdem, ob der formale Aufbau einer E-Mail-Adresse entspricht oder nicht.
Aufgabe: was passiert, wenn E-Mail-Adressen mit Umlauten auftauchen?
TYP-Überprüfung
Oft ist der erste Schritt zu überprüfen, ob der Typ der eingegebenen Variablen dem vorgegebenen Format entspricht. Wenn ich eine Eingabe von Ganzzahlen erwarte (sprich Integer) und irgendwas anderes kommt, dann ist das schlecht.
INT
$zumtesten = 23423.23;
$testergebnis = filter_var($zumtesten, FILTER_VALIDATE_INT);
if ($testergebnis === false)
{
// invalide
echo "Typ entspricht NICHT dem erwarteten";
}
else
{
// valid
echo "Typ korrekt";
}
Float
Das Ganze für Zahlen mit Nachkommastellen:
$zumtesten = 23423.23;
$testergebnis = filter_var($zumtesten, FILTER_VALIDATE_FLOAT);
if ($testergebnis === false)
{
// invalide
echo "Typ entspricht NICHT dem erwarteten";
}
else
{
// valid
echo "Typ korrekt";
}
Boolean
$zumtesten = true;
$testergebnis = filter_var($zumtesten, FILTER_VALIDATE_BOOLEAN);
if ($testergebnis === false)
{
// invalide
echo "Typ entspricht NICHT dem erwarteten";
}
else
{
// valid
echo "Typ korrekt";
}
URL überprüfen
$zumtesten = "http://www.php-kurs.com";
$testergebnis = filter_var($zumtesten, FILTER_VALIDATE_URL);
if ($testergebnis === false)
{
// invalide
echo "Typ entspricht NICHT dem erwarteten";
}
else
{
// valid
echo "Typ korrekt";
}
alle vorhandenen Filter
und wer sich alle vorhandenen Filter ansehen möchte:
echo "<pre>";
$filters = filter_list();
print_r ( $filters );
Benutzereingaben über Formular
Benutzereingaben kommen über ein Formular per $_GET herein – im folgenden Beispiel die id:
$testergebnis = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
Heilen (SANITIZE) von vorliegenden Benutzereingaben
Durch das Heilen können Strings bereinigt werden – für einige Aufgaben sehr praktisch:
Der Aufbau ist fast identisch zu oben:
$geheilt = filter_var($zumtesten, FILTER_SANITIZE_art);
- FILTER_SANITIZE_STRING
$geheilt = filter_var($zumtesten, FILTER_SANITIZE_STRING);
Entfernt die Zeichen „<>?“ - FILTER_SANITIZE_STRIPPED Entfernt die Zeichen „<>?“
- FILTER_SANITIZE_ENCODED Wandelt `~!@#$%^&*()=+[{]};:'".?/| in %hex um
- FILTER_SANITIZE_ SPECIAL_CHARS Wandelt <>&" in &type;
- FILTER_SANITIZE_ EMAIL Entfernt die Zeichen ();:<>,\”
- FILTER_SANITIZE_ URL Nur erlaubt sind a-zA-Z0-9`~!@#$%^&*()-_=+[{]};:'"<,>.?/|
- FILTER_SANITIZE_ NUMBER_INT Nur erlaubt sind 1234567890-+
- FILTER_SANITIZE_ NUMBER_FLOAT Nur erlaubt sind 1234567890-+.
- FILTER_SANITIZE_ MAGIC_QUOTES maskieren von " ind \"
FLAGS
Über die Flags können den Filter weitere Optionen mitgegeben werden. Die meisten Flags arbeiten nur mit einem bestimmten validate/sanitize zusammen.
Beispiel für die Erweiterung FILTER_FLAG_ALLOW_HEX, die hexadezimale Eingaben zulässt. Damit lässt sich z.B. überprüfen, ob ein Farbwert eingegeben wurde. Dieses Flag arbeitet nur mit dem FILTER_VALIDATE_INT bzw. FILTER_SANITIZE_ NUMBER_INT zusammen.
$eingabe = "ff00e8";
$hexadezimal = filter_var($eingabe,
FILTER_SANITIZE_NUMBER_INT, FILTER_FLAG_ALLOW_HEX);
Hier verschiedene Flags (in Klammern, womit diese zusammenarbeiten)
- FILTER_NULL_ON_FAILURE – es kommt 0 zurück anstatt eines leeren Ergebnisses oder wenn die Überprüfung fehlschlägt
- FILTER_FLAG_ALLOW_OCTAL (*_INT) – Zahlen im Oktal-System
- FILTER_FLAG_STRIP_LOW – kleiner als 32 in ASCII
- FILTER_FLAG_STRIP_HIGH – größer als 127 in ASCII
- FILTER_FLAG_ENCODE_LOW – kleiner als 32 in ASCII
- FILTER_FLAG_ENCODE_HIGH – größer als 127 in ASCII
- FILTER_FLAG_NO_ENCODE_QUOTES – ignoriert einfache und doppelte Anführungszeichen
- FILTER_FLAG_ALLOW_FRACTION (*_NUMBER_FLOAT) – erlaubt sind 1234567890-+. (mit Punkt, ohne Komma)
- FILTER_FLAG_ALLOW_THOUSAND (*_NUMBER_FLOAT) – erlaubt sind 1234567890-+, (ohne Punkt, mit Komma)
- FILTER_FLAG_ALLOW_SCIENTIFIC (*_NUMBER_FLOAT) – erlaubt sind eE1234567890-+ (weder Punkt noch Komma)
- FILTER_FLAG_SCHEME_REQUIRED (VALIDATE_URL) – bestimmter URL-Aufbau muss gegeben sein
- FILTER_FLAG_HOST_REQUIRED (VALIDATE_URL) – bestimmter URL-Aufbau muss gegeben sein
- FILTER_FLAG_PATH_REQUIRED (VALIDATE_URL) – bestimmter URL-Aufbau muss gegeben sein
- FILTER_FLAG_QUERY_REQUIRED (VALIDATE_URL) – bestimmter URL-Aufbau muss gegeben sein
Wenn Sie einen Fehler finden, bitte mitteilen (egal ob Schreibfehler oder inhaltlicher Fehler).
Mit Maus fehlerhafte Stelle markieren und übernehmen mit folgendem Button: