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:
- Validieren — prü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 SieFILTER_VALIDATE_*-Filter. - Bereinigen — entfernt 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): mixedValidierung
<?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)); // stringAusgabe:
Email is valid
int(42)
bool(false)
string(18) "https://w3docs.com"Achtung: Validierungsfilter geben bei einem Fehler
falsezurück, aber0und""sind ebenfalls falsy.filter_var("0", FILTER_VALIDATE_INT)gibtint(0)zurück, was bei einer einfachenif-Prüfung fehlschlägt. Vergleichen Sie mit=== false, oder übergeben SieFILTER_NULL_ON_FAILURE, damit Fehler zunullwerden und Sie!== nullverwenden 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]
<script>alert(1)</script>HiOptionen 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): mixedDer $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
| Filter | Typ | Zweck |
|---|---|---|
FILTER_VALIDATE_EMAIL | validate | E-Mail-Adresse |
FILTER_VALIDATE_URL | validate | URL |
FILTER_VALIDATE_INT / FILTER_VALIDATE_FLOAT | validate | Ganze / Dezimalzahlen |
FILTER_VALIDATE_IP | validate | IPv4 / IPv6-Adresse |
FILTER_VALIDATE_BOOLEAN | validate | "yes", "on", "1" → true |
FILTER_SANITIZE_EMAIL | sanitize | Unerlaubte E-Mail-Zeichen entfernen |
FILTER_SANITIZE_URL | sanitize | Unerlaubte URL-Zeichen entfernen |
FILTER_SANITIZE_NUMBER_INT | sanitize | Nur Ziffern und + - behalten |
FILTER_SANITIZE_SPECIAL_CHARS | sanitize | HTML-Kodierung von < > & " ' |
Seit PHP 8.1 veraltet:
FILTER_SANITIZE_STRING(und sein AliasFILTER_SANITIZE_STRIPPED). Zur Ausgabe-Maskierung verwenden Siehtmlspecialchars(); 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
ideine 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.