filter_input()
Wie PHP's filter_input() GET-, POST- und Cookie-Eingaben bereinigt und validiert — mit FILTER_SANITIZE_*, FILTER_VALIDATE_* und Rückgabewerten.
Einführung
filter_input() ist eine eingebaute PHP-Funktion, die eine einzelne externe Variable — aus $_GET, $_POST, Cookies, der Serverumgebung oder getenv() — liest und sie in einem Schritt durch einen Filter verarbeitet. Ein Filter bereinigt den Wert (entfernt oder maskiert unerwünschte Zeichen) oder validiert ihn (prüft, ob er einem erwarteten Format entspricht, und weist ihn andernfalls zurück).
Der entscheidende Vorteil von filter_input() gegenüber dem direkten Zugriff auf $_GET['x'] ist Sicherheit durch Design: Sie erhalten nie einen rohen Superglobal in die Hände, die Funktion meldet sauber, wenn eine Variable fehlt, und der Filter wird genau in dem Moment angewendet, in dem der Wert gelesen wird. Diese Seite behandelt die Syntax, den Unterschied zwischen Bereinigung und Validierung, wie die drei möglichen Rückgabewerte zu interpretieren sind, und ein vollständiges Formularverarbeitungsbeispiel.
Möchten Sie einen Wert filtern, den Sie bereits in einer Variable haben (nicht aus einem Superglobal)? Verwenden Sie
filter_var(). Um viele Felder gleichzeitig zu filtern, siehefilter_input_array().
Syntax
filter_input(int $type, string $var_name, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed| Parameter | Erforderlich | Beschreibung |
|---|---|---|
$type | Ja | Die Eingabequelle: INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER oder INPUT_ENV. |
$var_name | Ja | Der Name der zu lesenden Variable, z. B. 'email'. |
$filter | Nein | Eine Filter-ID wie FILTER_VALIDATE_EMAIL. Standardmäßig FILTER_DEFAULT (keine Filterung). |
$options | Nein | Ein assoziatives Array mit Optionen/Flags oder eine Flags-Bitmaske. Wird für Bereiche, Standardwerte, regexp usw. verwendet. |
Rückgabewerte
filter_input() hat drei mögliche Rückgabewerte, und deren Unterscheidung ist der eigentliche Sinn der Funktion:
- den gefilterten Wert bei Erfolg;
false, wenn die Filterung (Validierung) fehlschlägt;null, wenn die Variable in der angeforderten Eingabequelle nicht gesetzt ist.
Da false und null unterschiedliche Bedeutungen haben, vergleichen Sie mit === statt mit einer losen Wahrheitsüberprüfung.
Bereinigen vs. Validieren
Dies ist der häufigste Punkt der Verwirrung, daher sollte die Wahl bewusst getroffen werden:
- Bereinigen (
FILTER_SANITIZE_*) — säubert den Wert und gibt den bereinigten String zurück. Es „schlägt" praktisch nie fehl; es entfernt oder maskiert nur Zeichen. - Validieren (
FILTER_VALIDATE_*) — prüft den Wert und gibt ihn bei Erfolg unverändert zurück oderfalsebei einem Fehler. Verwenden Sie dies immer dann, wenn das Feld eine strenge Form hat (E-Mail, Integer, URL, boolean).
FILTER_SANITIZE_STRINGwurde in PHP 8.0 entfernt. Verwenden Sie stattdessenFILTER_SANITIZE_FULL_SPECIAL_CHARS(oderhtmlspecialchars()zur Ausgabezeit).
Eingaben bereinigen
Das folgende Beispiel liest ein name-Feld aus einer POST-Anfrage und maskiert alle HTML-Sonderzeichen, damit der Wert sicher gespeichert und später ausgegeben werden kann.
<?php
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
if ($name === null) {
$name = ''; // field was not submitted at all
}
echo $name;FILTER_SANITIZE_FULL_SPECIAL_CHARS HTML-kodiert alle Sonderzeichen (ähnlich wie htmlspecialchars() mit ENT_QUOTES), sodass aus <b>Joe</b> der Wert <b>Joe</b> wird.
Eingaben validieren
Bei Feldern mit einem festen Format sollte man validieren statt bereinigen. Hier gibt FILTER_VALIDATE_EMAIL die Adresse bei Erfolg zurück oder false bei einem Fehler:
<?php
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if ($email === null) {
echo "No email submitted.";
} elseif ($email === false) {
echo "Invalid email address.";
} else {
echo "Valid email: $email";
}Zahlen mit Optionen validieren
Der vierte Parameter erlaubt es, einen Wert einzuschränken. Dies akzeptiert eine ganzzahlige Seitenzahl nur, wenn sie zwischen 1 und 100 liegt, und fällt andernfalls auf 1 zurück:
<?php
$page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT, [
'options' => [
'min_range' => 1,
'max_range' => 100,
'default' => 1, // returned when validation fails
],
]);
echo "Page: $page";Ein vollständiges Formularbeispiel
In einer echten Anfrage liest man jedes Feld direkt aus der Eingabequelle:
<?php
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$age = filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT, [
'options' => ['min_range' => 0, 'max_range' => 120],
]);
$errors = [];
if ($email === false) {
$errors[] = 'Invalid email.';
}
if ($age === false) {
$errors[] = 'Age must be a whole number between 0 and 120.';
}
if ($errors) {
echo implode("\n", $errors);
} else {
echo "Name: $name\nEmail: $email\nAge: $age\n";
}Für eine gültige Übermittlung (name=<b>Jane</b>, [email protected], age=34) gibt dies aus:
Name: <b>Jane</b>
Email: [email protected]
Age: 34Hinweis:
filter_input()liest die Variablen, die PHP aus der tatsächlichen HTTP-Anfrage erfasst hat, nicht Werte, die Sie später im Code$_GET/$_POSTzuweisen. Das macht die Funktion manipulationssicher, bedeutet aber auch, dass sienullfür jedes Feld zurückgibt, wenn ein Skript von der Kommandozeile ohne eine dahinterliegende Anfrage ausgeführt wird — testen Sie Eingabefilter mitfilter_var()an einem Beispiel-String.
Wann verwenden
Verwenden Sie filter_input(), wann immer ein Wert von außen in Ihre Anwendung gelangt:
- Query-Strings und Formulare — lesen Sie
INPUT_GET- /INPUT_POST-Felder mit dem richtigen Validator, anstatt rohen Superglobals zu vertrauen. - Paginierung, IDs, Preise —
FILTER_VALIDATE_INT/FILTER_VALIDATE_FLOATmit einem Bereichs-Guard weist Eingaben außerhalb des Bereichs oder nicht-numerische Eingaben zurück, bevor sie eine Abfrage erreichen. - Kontaktformulare —
FILTER_VALIDATE_EMAILundFILTER_VALIDATE_URLerzwingen die Form an der Grenze. Siehe die ausgearbeitete Schritt-für-Schritt-Anleitung in PHP Form Validation.
Das Filtern an der Eingabegrenze hält die Validierungslogik an einem Ort und trennt sie von der Geschäftslogik, was den Code leichter lesbar, testbar und prüfbar macht. Die vollständige Liste der verfügbaren Filter finden Sie unter PHP Filters.
Fazit
filter_input() liest eine externe Variable und filtert sie in einem einzigen, klar definierten Schritt. Greifen Sie zu einem FILTER_VALIDATE_*-Filter, wenn ein Feld ein striktes Format hat, und zu einem FILTER_SANITIZE_*-Filter, wenn Sie nur einen Wert bereinigen müssen. Vergleichen Sie den Rückgabewert immer mit ===, damit Sie eine fehlende Variable (null) von einer fehlgeschlagenen (false) unterscheiden können.