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 :
- Validation — vérifie si une valeur correspond à une règle et retourne la valeur si c'est le cas, ou
falsedans le cas contraire. Elle ne modifie jamais la valeur. Utilisez les filtresFILTER_VALIDATE_*. - Assainissement — supprime 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): mixedValidation
<?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)); // stringRésultat :
Email is valid
int(42)
bool(false)
string(18) "https://w3docs.com"Piège : les filtres de validation retournent
falseen cas d'échec, mais0et""sont également falsy.filter_var("0", FILTER_VALIDATE_INT)retourneint(0), ce qui échoue avec un simpleif. Comparez avec=== false, ou passezFILTER_NULL_ON_FAILUREpour que les échecs deviennentnullet 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]
<script>alert(1)</script>HiPasser 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): mixedLe 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
| Filtre | Type | Rôle |
|---|---|---|
FILTER_VALIDATE_EMAIL | validation | Adresse e-mail |
FILTER_VALIDATE_URL | validation | URL |
FILTER_VALIDATE_INT / FILTER_VALIDATE_FLOAT | validation | Nombres entiers / décimaux |
FILTER_VALIDATE_IP | validation | Adresse IPv4 / IPv6 |
FILTER_VALIDATE_BOOLEAN | validation | "yes", "on", "1" → true |
FILTER_SANITIZE_EMAIL | assainissement | Supprimer les caractères e-mail illégaux |
FILTER_SANITIZE_URL | assainissement | Supprimer les caractères URL illégaux |
FILTER_SANITIZE_NUMBER_INT | assainissement | Conserver les chiffres et + - |
FILTER_SANITIZE_SPECIAL_CHARS | assainissement | Encoder en HTML < > & " ' |
Déprécié depuis PHP 8.1 :
FILTER_SANITIZE_STRING(et son aliasFILTER_SANITIZE_STRIPPED). Pour échapper la sortie, utilisezhtmlspecialchars(); 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
iddans 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.