W3docs

PHP Filter

Apprenez l'extension filter de PHP : validation vs assainissement, filter_var(), filter_input(), les constantes FILTER_VALIDATE_* et FILTER_SANITIZE_*, et les drapeaux.

L'extension filter de PHP est l'outil intégré permettant de vérifier et de nettoyer les données provenant de l'extérieur de votre script — champs de formulaire, chaînes de requête, cookies et en-têtes HTTP. Comme ces données sont contrôlées par l'utilisateur (et parfois par un attaquant), vous ne devez jamais leur faire confiance directement. Cette page explique la différence entre la validation et l'assainissement, les principales fonctions (filter_var() et filter_input()), les constantes de filtre les plus utilisées, ainsi que les pièges courants.

Validation vs. assainissement

L'extension filter effectue deux tâches distinctes, et les confondre est l'erreur la plus fréquente :

  • Validationvérifie si une valeur correspond à une règle et retourne la valeur si c'est le cas, ou false dans le cas contraire. Elle ne modifie jamais la valeur. Utilisez les filtres FILTER_VALIDATE_*.
  • Assainissementsupprime ou échappe les caractères illégaux et retourne la chaîne nettoyée. Elle ne vous indique jamais si la saisie était « correcte ». Utilisez les filtres FILTER_SANITIZE_*.

Règle générale : validez pour décider si vous acceptez la saisie, assainissez pour la rendre sûre à utiliser. Ces deux opérations ne sont pas interchangeables — un email assaini ne garantit pas que l'adresse e-mail est bien formée.

filter_var() — filtrer une seule variable

filter_var() est la fonction principale. Elle prend une valeur, une constante de filtre et des options facultatives :

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

Validation

<?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

Résultat :

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

Piège : les filtres de validation retournent false en cas d'échec, mais 0 et "" sont également falsy. filter_var("0", FILTER_VALIDATE_INT) retourne int(0), ce qui échoue avec un simple if. Comparez avec === false, ou passez FILTER_NULL_ON_FAILURE pour que les échecs deviennent null et que vous puissiez utiliser !== null.

Assainissement

<?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";

Résultat :

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

Passer des options et des drapeaux

De nombreux filtres acceptent des options supplémentaires. Par exemple, valider un entier uniquement dans une plage donnée :

<?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)

Résultat :

bool(false)
int(25)

Parmi les drapeaux utiles, on trouve FILTER_NULL_ON_FAILURE (retourne null au lieu de false), FILTER_FLAG_STRIP_LOW (supprime les caractères en dessous de l'ASCII 32), ainsi que FILTER_FLAG_IPV6 / FILTER_FLAG_IPV4 pour affiner FILTER_VALIDATE_IP.

filter_input() — filtrer les données de requête directement

filter_input() lit une valeur directement depuis une superglobale (par nom) et la filtre en une seule étape, ce qui vous évite de toucher directement le tableau brut $_POST / $_GET :

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

Le paramètre $type est l'un des suivants : INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER ou 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";
}

Notez les trois résultats possibles : une valeur (validée), false (présente mais invalide), ou null (le champ n'existait pas). Pour filtrer un formulaire entier en une seule fois, consultez filter_var_array() et filter_input_array().

Constantes de filtre courantes

FiltreTypeRôle
FILTER_VALIDATE_EMAILvalidationAdresse e-mail
FILTER_VALIDATE_URLvalidationURL
FILTER_VALIDATE_INT / FILTER_VALIDATE_FLOATvalidationNombres entiers / décimaux
FILTER_VALIDATE_IPvalidationAdresse IPv4 / IPv6
FILTER_VALIDATE_BOOLEANvalidation"yes", "on", "1"true
FILTER_SANITIZE_EMAILassainissementSupprimer les caractères e-mail illégaux
FILTER_SANITIZE_URLassainissementSupprimer les caractères URL illégaux
FILTER_SANITIZE_NUMBER_INTassainissementConserver les chiffres et + -
FILTER_SANITIZE_SPECIAL_CHARSassainissementEncoder en HTML < > & " '

Déprécié depuis PHP 8.1 : FILTER_SANITIZE_STRING (et son alias FILTER_SANITIZE_STRIPPED). Pour échapper la sortie, utilisez htmlspecialchars() ; pour nettoyer la saisie, préférez un filtre de validation spécifique combiné à un échappement adapté au contexte au moment de l'utilisation.

Quand l'utiliser ?

  • Vérifier un formulaire d'inscription ou de contact avant de sauvegarder — associez cela à PHP Form Validation et à la validation des champs URL et e-mail.
  • Confirmer qu'un id dans une chaîne de requête est bien un entier positif avant une requête en base de données.
  • Lire et faire confiance aux valeurs provenant des cookies ou de $_SERVER.

Le filtrage complète, sans pour autant remplacer, d'autres défenses : utilisez des instructions préparées (PHP MySQLi prepared statements) contre les injections SQL et htmlspecialchars() lors de l'affichage de données utilisateur en HTML. Pour des règles basées sur des motifs que l'extension filter ne peut pas exprimer, tournez-vous vers les expressions régulières.

Exercice

Pratique
Avec quoi PHP Filters aide-t-il lors de la soumission de données ?
Avec quoi PHP Filters aide-t-il lors de la soumission de données ?
Was this page helpful?