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();

Filter aktiv in PHP

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);

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)