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 Aufrufes

Soll nun ein 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, mit was 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