filter_input()
Apprenez comment filter_input() en PHP assainit et valide les entrées GET, POST et cookie — FILTER_SANITIZE_*, FILTER_VALIDATE_* et valeurs de retour.
Introduction
filter_input() est une fonction PHP intégrée qui lit une seule variable externe — depuis $_GET, $_POST, les cookies, l'environnement serveur ou getenv() — et lui applique un filtre en une seule étape. Un filtre soit assainit la valeur (supprime ou échappe les caractères indésirables), soit la valide (vérifie qu'elle correspond au format attendu et la rejette dans le cas contraire).
La principale raison de choisir filter_input() plutôt que d'accéder directement à $_GET['x'] est la sécurité par conception : vous n'obtenez jamais de superglobale brute entre les mains, la fonction signale proprement quand une variable est absente, et le filtre est appliqué au moment exact où vous lisez la valeur. Cette page couvre la syntaxe, la différence entre assainissement et validation, comment interpréter ses trois valeurs de retour possibles, et un exemple complet de traitement de formulaire.
Vous souhaitez filtrer une valeur que vous avez déjà dans une variable (et non depuis une superglobale) ? Utilisez
filter_var(). Pour filtrer plusieurs champs à la fois, consultezfilter_input_array().
Syntaxe
filter_input(int $type, string $var_name, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed| Paramètre | Requis | Description |
|---|---|---|
$type | Oui | La source d'entrée : INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER ou INPUT_ENV. |
$var_name | Oui | Le nom de la variable à lire, par ex. 'email'. |
$filter | Non | Un identifiant de filtre tel que FILTER_VALIDATE_EMAIL. Par défaut FILTER_DEFAULT (aucun filtrage). |
$options | Non | Un tableau associatif d'options/indicateurs, ou un masque de bits. Utilisé pour les plages, les valeurs par défaut, les expressions régulières, etc. |
Valeurs de retour
filter_input() possède trois valeurs de retour possibles, et les distinguer est tout l'intérêt de son utilisation :
- la valeur filtrée en cas de succès ;
falsesi le filtrage (la validation) échoue ;nullsi la variable n'est pas définie dans la source d'entrée demandée.
Étant donné que false et null ont des significations différentes, comparez avec === plutôt qu'une vérification de vérité approximative.
Assainissement vs. validation
Il s'agit du point de confusion le plus courant, alors faites ce choix délibérément :
- Assainir (
FILTER_SANITIZE_*) — nettoie la valeur et retourne la chaîne nettoyée. Cela n'« échoue » presque jamais ; cela supprime ou échappe simplement les caractères. - Valider (
FILTER_VALIDATE_*) — vérifie la valeur et la retourne inchangée en cas de succès oufalseen cas d'échec. Utilisez ceci lorsque le champ a une forme stricte (email, entier, URL, booléen).
FILTER_SANITIZE_STRINGa été supprimé en PHP 8.0. UtilisezFILTER_SANITIZE_FULL_SPECIAL_CHARS(ouhtmlspecialchars()au moment de l'affichage) à la place.
Assainissement des entrées
L'exemple ci-dessous lit un champ name depuis une requête POST et échappe les caractères spéciaux HTML afin que la valeur soit sûre à stocker et à afficher ultérieurement.
<?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 encode en HTML chaque caractère spécial (similaire à htmlspecialchars() avec ENT_QUOTES), donc <b>Joe</b> devient <b>Joe</b>.
Validation des entrées
Pour les champs ayant un format fixe, validez plutôt qu'assainissez. Ici, FILTER_VALIDATE_EMAIL retourne l'adresse en cas de succès ou false en cas d'échec :
<?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";
}Validation de nombres avec des options
Le quatrième paramètre vous permet de contraindre une valeur. Ceci accepte un numéro de page entier uniquement s'il est compris entre 1 et 100, et retourne 1 dans le cas contraire :
<?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";Un exemple de formulaire complet
Dans une vraie requête, vous lisez chaque champ directement depuis la source d'entrée :
<?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";
}Pour une soumission valide (name=<b>Jane</b>, [email protected], age=34), ceci affiche :
Name: <b>Jane</b>
Email: [email protected]
Age: 34Remarque :
filter_input()lit les variables que PHP a capturées depuis la vraie requête HTTP, pas les valeurs que vous assignez ultérieurement à$_GET/$_POSTdans le code. Cela la rend résistante aux manipulations, mais cela signifie aussi que la fonction retournenullpour chaque champ lorsqu'un script est exécuté depuis la ligne de commande sans requête derrière — testez les filtres d'entrée avecfilter_var()sur une chaîne d'exemple à la place.
Quand l'utiliser
Utilisez filter_input() chaque fois qu'une valeur entre dans votre application depuis le monde extérieur :
- Chaînes de requête et formulaires — récupérez les champs
INPUT_GET/INPUT_POSTavec le bon validateur plutôt que de faire confiance aux superglobales brutes. - Pagination, identifiants, prix —
FILTER_VALIDATE_INT/FILTER_VALIDATE_FLOATavec une contrainte de plage rejette les entrées hors limites ou non numériques avant qu'elles n'atteignent une requête. - Formulaires de contact —
FILTER_VALIDATE_EMAILetFILTER_VALIDATE_URLimposent la forme à la frontière. Consultez le guide pratique dans Validation de formulaires PHP.
Filtrer à la frontière d'entrée centralise la logique de validation et la sépare de votre logique métier, ce qui rend le code plus facile à lire, tester et auditer. Pour la liste complète des filtres disponibles, consultez Filtres PHP.
Conclusion
filter_input() lit une variable externe et la filtre en une seule étape bien définie. Optez pour un filtre FILTER_VALIDATE_* lorsqu'un champ a un format strict et pour un filtre FILTER_SANITIZE_* lorsque vous avez seulement besoin de nettoyer une valeur, et vérifiez toujours la valeur de retour avec === pour distinguer une variable absente (null) d'une variable invalide (false).