W3docs

PHP Filter

PHP-Filter-Erweiterung: Validierung vs. Bereinigung, filter_var(), filter_input(), FILTER_VALIDATE_* und FILTER_SANITIZE_* Konstanten und Flags.

Die PHP Filter-Erweiterung ist das eingebaute Werkzeug zum Prüfen und Bereinigen von Daten, die von außerhalb Ihres Skripts stammen — Formularfelder, Query-Strings, Cookies und HTTP-Header. Da diese Daten vom Benutzer (und manchmal von einem Angreifer) kontrolliert werden, sollten Sie ihnen niemals direkt vertrauen. Diese Seite erklärt den Unterschied zwischen Validierung und Bereinigung, die wichtigsten Funktionen (filter_var() und filter_input()), die am häufigsten verwendeten Filterkonstanten sowie typische Stolperfallen.

Validierung vs. Bereinigung

Die Filter-Erweiterung erfüllt zwei unterschiedliche Aufgaben, und sie zu verwechseln ist der häufigste Fehler:

  • Validierenprüft, ob ein Wert einer Regel entspricht, und gibt den Wert zurück, wenn ja, oder false, wenn nicht. Der Wert wird dabei nie verändert. Verwenden Sie FILTER_VALIDATE_*-Filter.
  • Bereinigenentfernt oder maskiert unerlaubte Zeichen und gibt die bereinigte Zeichenkette zurück. Es wird dabei nicht mitgeteilt, ob die Eingabe „korrekt" war. Verwenden Sie FILTER_SANITIZE_*-Filter.

Faustregel: Validieren Sie, um zu entscheiden, ob die Eingabe akzeptiert werden soll; bereinigen Sie, um sie sicher verwendbar zu machen. Die beiden Methoden sind nicht austauschbar — eine bereinigte E-Mail-Adresse ist keine Garantie dafür, dass sie korrekt formatiert ist.

filter_var() — eine einzelne Variable filtern

filter_var() ist die Hauptfunktion. Sie nimmt einen Wert, eine Filterkonstante und optionale Optionen entgegen:

filter_var(mixed $value, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed

Validierung

<?php
$email = "[email protected]";

if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "Email is valid\n";
} else {
    echo "Email is invalid\n";
}

// Numbers, URLs and IPs work the same way:
var_dump(filter_var("42", FILTER_VALIDATE_INT));        // int(42)
var_dump(filter_var("not-a-number", FILTER_VALIDATE_INT)); // bool(false)
var_dump(filter_var("https://w3docs.com", FILTER_VALIDATE_URL)); // string

Ausgabe:

Email is valid
int(42)
bool(false)
string(18) "https://w3docs.com"

Achtung: Validierungsfilter geben bei einem Fehler false zurück, aber 0 und "" sind ebenfalls falsy. filter_var("0", FILTER_VALIDATE_INT) gibt int(0) zurück, was bei einer einfachen if-Prüfung fehlschlägt. Vergleichen Sie mit === false, oder übergeben Sie FILTER_NULL_ON_FAILURE, damit Fehler zu null werden und Sie !== null verwenden können.

Bereinigung

<?php
$dirty = "  john (doe)@exa<>mple.com  ";
echo filter_var($dirty, FILTER_SANITIZE_EMAIL), "\n"; // [email protected]

$comment = "<script>alert(1)</script>Hi";
echo filter_var($comment, FILTER_SANITIZE_SPECIAL_CHARS), "\n";

Ausgabe:

[email protected]
&#60;script&#62;alert(1)&#60;/script&#62;Hi

Optionen und Flags übergeben

Viele Filter akzeptieren zusätzliche Optionen. Zum Beispiel kann ein Integer nur innerhalb eines bestimmten Bereichs validiert werden:

<?php
$options = [
    "options" => ["min_range" => 1, "max_range" => 120],
];
var_dump(filter_var("130", FILTER_VALIDATE_INT, $options)); // bool(false)
var_dump(filter_var("25",  FILTER_VALIDATE_INT, $options)); // int(25)

Ausgabe:

bool(false)
int(25)

Nützliche Flags sind FILTER_NULL_ON_FAILURE (gibt null statt false zurück), FILTER_FLAG_STRIP_LOW (entfernt Zeichen unterhalb von ASCII 32) sowie FILTER_FLAG_IPV6 / FILTER_FLAG_IPV4 zur Einschränkung von FILTER_VALIDATE_IP.

filter_input() — Request-Daten direkt filtern

filter_input() liest einen Wert direkt aus einem Superglobal (per Name) und filtert ihn in einem Schritt, sodass Sie das rohe $_POST- / $_GET-Array nie anfassen müssen:

filter_input(int $type, string $var_name, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed

Der $type-Parameter ist einer von INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER oder INPUT_ENV:

<?php
// In a real form handler:
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);

if ($email === false) {
    echo "Please enter a valid email.";
} elseif ($email === null) {
    echo "The email field was not submitted.";
} else {
    echo "Got: $email";
}

Beachten Sie die drei möglichen Ergebnisse: ein Wert (gültig), false (vorhanden, aber ungültig) oder null (das Feld wurde nicht übermittelt). Um ein ganzes Formular auf einmal zu filtern, siehe filter_var_array() und filter_input_array().

Häufige Filterkonstanten

FilterTypZweck
FILTER_VALIDATE_EMAILvalidateE-Mail-Adresse
FILTER_VALIDATE_URLvalidateURL
FILTER_VALIDATE_INT / FILTER_VALIDATE_FLOATvalidateGanze / Dezimalzahlen
FILTER_VALIDATE_IPvalidateIPv4 / IPv6-Adresse
FILTER_VALIDATE_BOOLEANvalidate"yes", "on", "1"true
FILTER_SANITIZE_EMAILsanitizeUnerlaubte E-Mail-Zeichen entfernen
FILTER_SANITIZE_URLsanitizeUnerlaubte URL-Zeichen entfernen
FILTER_SANITIZE_NUMBER_INTsanitizeNur Ziffern und + - behalten
FILTER_SANITIZE_SPECIAL_CHARSsanitizeHTML-Kodierung von < > & " '

Seit PHP 8.1 veraltet: FILTER_SANITIZE_STRING (und sein Alias FILTER_SANITIZE_STRIPPED). Zur Ausgabe-Maskierung verwenden Sie htmlspecialchars(); zur Eingabebereinigung bevorzugen Sie einen spezifischen Validierungsfilter und eine kontextgerechte Maskierung am Verwendungsort.

Wann sollte ich es verwenden?

  • Prüfung eines Registrierungs- oder Kontaktformulars vor dem Speichern — kombinieren Sie dies mit PHP Form Validation und URL- & E-Mail-Felder validieren.
  • Sicherstellen, dass ein Query-String-Parameter id eine positive ganze Zahl ist, bevor eine Datenbankabfrage erfolgt.
  • Lesen und Vertrauen von Werten aus Cookies oder $_SERVER.

Filterung ergänzt andere Sicherheitsmaßnahmen, ersetzt sie aber nicht: Verwenden Sie Prepared Statements (PHP MySQLi prepared statements) gegen SQL-Injection und htmlspecialchars() beim Ausgeben von Benutzerdaten in HTML. Für musterbasierte Regeln, die die Filter-Erweiterung nicht ausdrücken kann, greifen Sie auf reguläre Ausdrücke zurück.

Übung

Übung
Womit hilft PHP Filters bei der Verarbeitung von übermittelten Daten?
Womit hilft PHP Filters bei der Verarbeitung von übermittelten Daten?
Was this page helpful?