W3docs

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

Syntaxe

filter_input(int $type, string $var_name, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed
ParamètreRequisDescription
$typeOuiLa source d'entrée : INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER ou INPUT_ENV.
$var_nameOuiLe nom de la variable à lire, par ex. 'email'.
$filterNonUn identifiant de filtre tel que FILTER_VALIDATE_EMAIL. Par défaut FILTER_DEFAULT (aucun filtrage).
$optionsNonUn 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 ;
  • false si le filtrage (la validation) échoue ;
  • null si 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 ou false en cas d'échec. Utilisez ceci lorsque le champ a une forme stricte (email, entier, URL, booléen).

FILTER_SANITIZE_STRING a été supprimé en PHP 8.0. Utilisez FILTER_SANITIZE_FULL_SPECIAL_CHARS (ou htmlspecialchars() 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 &lt;b&gt;Joe&lt;/b&gt;.

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:  &lt;b&gt;Jane&lt;/b&gt;
Email: [email protected]
Age:   34

Remarque : 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/$_POST dans le code. Cela la rend résistante aux manipulations, mais cela signifie aussi que la fonction retourne null pour chaque champ lorsqu'un script est exécuté depuis la ligne de commande sans requête derrière — testez les filtres d'entrée avec filter_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_POST avec le bon validateur plutôt que de faire confiance aux superglobales brutes.
  • Pagination, identifiants, prixFILTER_VALIDATE_INT / FILTER_VALIDATE_FLOAT avec une contrainte de plage rejette les entrées hors limites ou non numériques avant qu'elles n'atteignent une requête.
  • Formulaires de contactFILTER_VALIDATE_EMAIL et FILTER_VALIDATE_URL imposent 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).

Pratique

Pratique
Lesquelles des fonctions PHP suivantes sont utilisées pour assainir et valider des formulaires ?
Lesquelles des fonctions PHP suivantes sont utilisées pour assainir et valider des formulaires ?
Was this page helpful?