W3docs

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, siehe filter_input_array().

Syntax

filter_input(int $type, string $var_name, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed
ParameterErforderlichBeschreibung
$typeJaDie Eingabequelle: INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER oder INPUT_ENV.
$var_nameJaDer Name der zu lesenden Variable, z. B. 'email'.
$filterNeinEine Filter-ID wie FILTER_VALIDATE_EMAIL. Standardmäßig FILTER_DEFAULT (keine Filterung).
$optionsNeinEin 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 oder false bei einem Fehler. Verwenden Sie dies immer dann, wenn das Feld eine strenge Form hat (E-Mail, Integer, URL, boolean).

FILTER_SANITIZE_STRING wurde in PHP 8.0 entfernt. Verwenden Sie stattdessen FILTER_SANITIZE_FULL_SPECIAL_CHARS (oder htmlspecialchars() 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 &lt;b&gt;Joe&lt;/b&gt; 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:  &lt;b&gt;Jane&lt;/b&gt;
Email: [email protected]
Age:   34

Hinweis: filter_input() liest die Variablen, die PHP aus der tatsächlichen HTTP-Anfrage erfasst hat, nicht Werte, die Sie später im Code $_GET/$_POST zuweisen. Das macht die Funktion manipulationssicher, bedeutet aber auch, dass sie null für jedes Feld zurückgibt, wenn ein Skript von der Kommandozeile ohne eine dahinterliegende Anfrage ausgeführt wird — testen Sie Eingabefilter mit filter_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, PreiseFILTER_VALIDATE_INT / FILTER_VALIDATE_FLOAT mit einem Bereichs-Guard weist Eingaben außerhalb des Bereichs oder nicht-numerische Eingaben zurück, bevor sie eine Abfrage erreichen.
  • KontaktformulareFILTER_VALIDATE_EMAIL und FILTER_VALIDATE_URL erzwingen 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.

Übungen

Übung
Welche der folgenden PHP-Funktionen werden zum Bereinigen und Validieren von Formularen verwendet?
Welche der folgenden PHP-Funktionen werden zum Bereinigen und Validieren von Formularen verwendet?
Was this page helpful?