Erweiterte PHP-Filter: Ein umfassender Leitfaden
Lernen Sie erweiterte PHP-Filter kennen: Flags, Callbacks, Batch-Filterung, Standardwerte und typische Fallstricke in der Produktion.
Das Filtern von Eingaben gehört zu den wichtigsten Sicherheitsgewohnheiten in PHP: Jeder Wert, der von außerhalb Ihres Codes eintrifft — Formularfelder, Query-Strings, Cookies, API-Payloads — sollte als nicht vertrauenswürdig behandelt werden, bis er validiert oder bereinigt wurde. PHP wird mit einer integrierten Filter-Extension geliefert, die genau das erledigt, sodass Sie für gängige Prüfungen selten reguläre Ausdrücke von Hand schreiben müssen. Dieses Kapitel geht über die Grundlagen hinaus und behandelt Filter-Flags, Callbacks, Batch-Filterung, Standardwerte und die Fallstricke, über die man im Produktionsbetrieb stolpert.
Wenn Sie noch nicht mit der Filter-Extension vertraut sind, beginnen Sie mit dem einführenden Kapitel PHP Filters und kehren Sie dann hierher zurück.
PHP-Filter verstehen
Ein Filter ist eine benannte Regel, die PHP über die Funktion filter_var() (und verwandte Funktionen) auf einen Wert anwendet. Ein Filter kann zwei Aufgaben erfüllen:
- Validieren — prüft, ob ein Wert bereits einem Format entspricht, und gibt den Wert bei Erfolg oder
falsebei Misserfolg zurück. Der Wert wird nicht verändert. - Bereinigen — transformiert einen Wert, indem unerwünschte Zeichen entfernt oder kodiert werden, und gibt den bereinigten String zurück.
Es ist wichtig zu wissen, welche Aufgabe benötigt wird: Validierung lehnt fehlerhafte Daten ab, Bereinigung schreibt sie um. Bei benutzerseitigen Formularen validiert man in der Regel zuerst (ablehnen) und bereinigt nur, wenn ein Wert akzeptiert und gesäubert werden muss (zum Beispiel beim HTML-Escaping vor der Anzeige).
Typen von Filtern
PHP bietet verschiedene Filtertypen für unterschiedliche Zwecke. Zu den am häufigsten verwendeten gehören:
- Validate-Filter: Diese Filter werden zur Validierung von Daten eingesetzt, z. B. um zu prüfen, ob ein String eine gültige E-Mail-Adresse ist oder eine Zahl in einem bestimmten Bereich liegt.
- Sanitize-Filter: Diese Filter werden zur Bereinigung von Daten verwendet, z. B. um schädliche Zeichen aus einem String zu entfernen oder Sonderzeichen in HTML-Entities umzuwandeln.
- Benutzerdefinierte Filter: Mit diesen Filtern können Sie eigene Filterfunktionen für spezifische Anforderungen definieren.
Eine Handvoll Filter deckt die große Mehrheit der realen Anforderungen ab:
| Filter | Aufgabe | Anwendungsbeispiel |
|---|---|---|
FILTER_VALIDATE_EMAIL | Validieren | E-Mail-Adresse prüfen |
FILTER_VALIDATE_INT | Validieren | Ganzzahl prüfen, optional innerhalb eines Bereichs |
FILTER_VALIDATE_FLOAT | Validieren | Gleitkommazahl prüfen |
FILTER_VALIDATE_URL | Validieren | URL prüfen |
FILTER_VALIDATE_IP | Validieren | IPv4/IPv6-Adresse prüfen |
FILTER_SANITIZE_FULL_SPECIAL_CHARS | Bereinigen | HTML-Sonderzeichen kodieren |
FILTER_SANITIZE_NUMBER_INT | Bereinigen | Alles außer Ziffern und +/- entfernen |
FILTER_SANITIZE_EMAIL | Bereinigen | In E-Mails unzulässige Zeichen entfernen |
Mit filter_list() können Sie alle Filter auflisten, die Ihr Build unterstützt.
PHP-Filter verwenden
Die grundlegende Syntax zum Anwenden eines Filters lautet:
PHP filter_var-Funktionssyntax
filter_var($variable, $filter, $options);Dabei ist $variable der zu filternde Wert, $filter eine Filterkonstante wie FILTER_VALIDATE_EMAIL, und das optionale Argument $options enthält Flags oder filterspezifische Optionen.
filter_var($variable, FILTER_VALIDATE_EMAIL);Hier prüft filter_var(), ob der in $variable gespeicherte Wert eine gültige E-Mail-Adresse ist, und gibt bei Erfolg die E-Mail oder bei Misserfolg false zurück.
Es gibt auch dedizierte Funktionen zum direkten Lesen externer Eingaben — filter_input() für einen einzelnen Wert und filter_input_array() für mehrere — die aus INPUT_GET, INPUT_POST, INPUT_COOKIE usw. lesen. Verwenden Sie diese anstatt $_GET/$_POST direkt anzusprechen, da sie die originalen Anfragedaten lesen, auch wenn eine Superglobale verändert wurde.
Erweiterte PHP-Filter-Optionen
PHP-Filter verfügen auch über verschiedene erweiterte Optionen, mit denen ihr Verhalten angepasst werden kann. Zu den am häufigsten verwendeten Optionen gehören:
- Flag-Optionen: Diese Optionen ändern das Filterverhalten, z. B. durch Erfordern eines bestimmten Datentyps oder das Zulassen mehrerer Werte. Zum Beispiel erlaubt
FILTER_FLAG_EMAIL_UNICODEinternationale Zeichen bei der E-Mail-Validierung. - Callback-Funktionen: Diese ermöglichen es, eine benutzerdefinierte Funktion an
FILTER_CALLBACKfür maßgeschneiderte Validierungs- oder Bereinigungslogik zu übergeben. - Array-Filterung: Verwenden Sie
filter_var_array()oderfilter_input_array(), um Filter auf mehrere Variablen gleichzeitig anzuwenden — besonders nützlich für die Verarbeitung von Formulardaten oder Query-Strings.
PHP-Filter-Beispiele
Hier sind einige Beispiele, wie PHP-Filter in der Praxis eingesetzt werden können:
PHP E-Mail mit filter_var validieren
In diesem Beispiel wird die Funktion filter_var zur Validierung einer E-Mail-Adresse verwendet. Wenn die E-Mail-Adresse gültig ist, gibt das Skript „Email is valid" aus, andernfalls „Email is not valid".
PHP String mit filter_var bereinigen
In diesem Beispiel wird die Funktion filter_var zur Bereinigung eines Strings verwendet. Der Filter FILTER_SANITIZE_FULL_SPECIAL_CHARS entfernt oder kodiert HTML-Tags und Sonderzeichen aus dem String, sodass ein sicherer und sauberer String entsteht, der in der Anwendung verwendet werden kann.
Erweiterte PHP-Filter-Beispiele
Um die volle Leistungsfähigkeit von PHP-Filtern zu nutzen, können Sie Callbacks und Array-Filterung einsetzen:
PHP-Filter mit Callback
<?php
function custom_sanitize($str) {
return strtoupper(trim($str));
}
$input = " hello world ";
$result = filter_var($input, FILTER_CALLBACK, ["options" => "custom_sanitize"]);
echo $result; // Outputs: HELLO WORLD
?>PHP-Array von Variablen filtern
<?php
$data = [
"email" => "[email protected]",
"age" => "25",
"url" => "https://example.com"
];
$filters = [
"email" => FILTER_VALIDATE_EMAIL,
"age" => ["filter" => FILTER_VALIDATE_INT, "options" => ["min_range" => 1, "max_range" => 120]],
"url" => FILTER_VALIDATE_URL
];
$result = filter_var_array($data, $filters);
print_r($result);
?>Dies gibt aus:
Array
(
[email] => [email protected]
[age] => 25
[url] => https://example.com
)Wenn ein Wert seinen Filter nicht besteht, enthält der entsprechende Schlüssel false anstelle des Werts, sodass genau erkennbar ist, welches Feld ungültig war.
Eine Ganzzahl innerhalb eines Bereichs validieren
Die Optionen min_range und max_range veranlassen FILTER_VALIDATE_INT, Zahlen außerhalb des Bereichs abzulehnen — nützlich für Werte wie eine Menge oder ein Alter:
<?php
$age = "150";
$options = ["options" => ["min_range" => 1, "max_range" => 120]];
var_dump(filter_var($age, FILTER_VALIDATE_INT, $options)); // bool(false)
?>Da 150 über max_range liegt, gibt der Filter false zurück, obwohl "150" ein vollkommen gültiger Ganzzahl-String ist.
Einen Standardwert bei fehlgeschlagener Validierung angeben
Die meisten Validate-Filter akzeptieren eine default-Option, sodass auf einen sicheren Wert zurückgegriffen werden kann anstatt false zu erhalten:
<?php
$price = filter_var("not-a-number", FILTER_VALIDATE_FLOAT, [
"options" => ["default" => 0.0]
]);
var_dump($price); // float(0)
?>Häufige Fallstricke
Einige Verhaltensweisen überraschen Einsteiger:
falseist ein gültiger Wert. Wenn ein Wert legitim0oder"0"ist, behandelt eine naiveif (filter_var(...))Prüfung ihn als Misserfolg. Vergleichen Sie explizit mit dem strikten Operator gegenfalse:if (filter_var($n, FILTER_VALIDATE_INT) === false).- Validierung ändert den Wert nicht.
FILTER_VALIDATE_*gibt Ihren ursprünglichen Wert (bei Bedarf gecastet) oderfalsezurück; es wird nie bereinigt. Wenn Sie einen gesäuberten String benötigen, verwenden Sie einenFILTER_SANITIZE_*-Filter. - E-Mail-Validierung ist keine Zustellbarkeitsverifizierung.
FILTER_VALIDATE_EMAILprüft nur die Syntax — es kann nicht bestätigt werden, ob das Postfach existiert. Fügen SieFILTER_FLAG_EMAIL_UNICODEhinzu, wenn Sie internationalisierte Adressen akzeptieren. - Bereinigung ist nicht dasselbe wie Escaping für SQL. Verwenden Sie Prepared Statements (oder
mysqli_real_escape_string()) für Datenbankabfragen; Filter dienen der Formatbereinigung, nicht der Abfragesicherheit.
Fazit
Zusammenfassend lässt sich sagen, dass PHP-Filter ein unverzichtbares Werkzeug für Webentwickler sind, die Eingabedaten validieren und bereinigen möchten. Mit den verschiedenen verfügbaren Typen und Optionen können Sie Ihre Filter problemlos auf die spezifischen Anforderungen Ihrer Anwendung zuschneiden. Ob Sie E-Mails validieren, schädliche Zeichen entfernen oder benutzerdefinierte Validierungen durchführen möchten — PHP-Filter sind die richtige Wahl.
Vergessen Sie nicht, Filter mit anderen Sicherheitsmaßnahmen zu kombinieren — Prepared Statements, Output-Escaping und CSRF-Schutz — um Ihre Webanwendung so sicher wie möglich zu halten. Eine vollständige Anleitung finden Sie unter PHP Form Validation.