Filtres PHP avancés : guide complet
Maîtrisez les filtres PHP avancés : drapeaux, callbacks, filtrage par lots, valeurs par défaut et pièges courants pour sécuriser vos applications web.
Filtrer les entrées est l'une des habitudes de sécurité les plus importantes en PHP : chaque valeur qui arrive de l'extérieur de votre code — champs de formulaire, chaînes de requête, cookies, charges utiles d'API — doit être considérée comme non fiable tant qu'elle n'a pas été validée ou nettoyée. PHP embarque une extension de filtres intégrée qui fait exactement cela, ce qui vous évite d'écrire des expressions régulières à la main pour les vérifications courantes. Ce chapitre va au-delà des bases et couvre les drapeaux de filtres, les callbacks, le filtrage en lot, les valeurs par défaut et les pièges qui surprennent les développeurs en production.
Si vous découvrez l'extension de filtres, commencez par le chapitre d'introduction Filtres PHP, puis revenez ici.
Comprendre les filtres PHP
Un filtre est une règle nommée que PHP applique à une valeur via la fonction filter_var() (et ses variantes). Un filtre peut effectuer deux types de tâches :
- Valider — vérifier si une valeur correspond déjà à un format et retourner la valeur en cas de succès ou
falseen cas d'échec. La valeur n'est pas modifiée. - Assainir — transformer une valeur en supprimant ou en encodant les caractères indésirables, et retourner la chaîne nettoyée.
Il est important de savoir de quelle tâche vous avez besoin : la validation rejette les données incorrectes, l'assainissement les réécrit. Pour les formulaires destinés aux utilisateurs, vous validez généralement d'abord (rejet), et assainissez uniquement lorsque vous devez accepter et nettoyer une valeur (par exemple, échapper le HTML avant l'affichage).
Types de filtres
PHP propose plusieurs types de filtres utilisables à différentes fins. Voici quelques-uns des filtres les plus couramment utilisés :
- Filtres de validation : ces filtres servent à valider des données, comme vérifier si une chaîne est une adresse email valide ou si un nombre se situe dans une plage donnée.
- Filtres d'assainissement : ces filtres servent à assainir des données, comme supprimer les caractères dangereux d'une chaîne ou convertir les caractères spéciaux en entités HTML.
- Filtres personnalisés : ces filtres vous permettent de définir vos propres fonctions de filtrage pour des besoins spécifiques.
Un petit nombre de filtres couvre la grande majorité des besoins réels :
| Filtre | Tâche | Exemple d'utilisation |
|---|---|---|
FILTER_VALIDATE_EMAIL | Valider | Vérifier une adresse email |
FILTER_VALIDATE_INT | Valider | Vérifier un entier, optionnellement dans une plage |
FILTER_VALIDATE_FLOAT | Valider | Vérifier un nombre à virgule flottante |
FILTER_VALIDATE_URL | Valider | Vérifier une URL |
FILTER_VALIDATE_IP | Valider | Vérifier une adresse IPv4/IPv6 |
FILTER_SANITIZE_FULL_SPECIAL_CHARS | Assainir | Encoder les caractères spéciaux HTML |
FILTER_SANITIZE_NUMBER_INT | Assainir | Supprimer tout sauf les chiffres et +/- |
FILTER_SANITIZE_EMAIL | Assainir | Supprimer les caractères interdits dans un email |
Vous pouvez lister tous les filtres supportés par votre installation avec filter_list().
Utiliser les filtres PHP
La syntaxe de base pour appliquer un filtre est :
Syntaxe de la fonction PHP filter_var
filter_var($variable, $filter, $options);Où $variable est la valeur à filtrer, $filter est une constante de filtre telle que FILTER_VALIDATE_EMAIL, et l'argument optionnel $options contient des drapeaux ou des options propres au filtre.
filter_var($variable, FILTER_VALIDATE_EMAIL);Ici, filter_var() vérifie si la valeur stockée dans $variable est une adresse email valide, retournant l'email en cas de succès ou false en cas d'échec.
Il existe également des fonctions dédiées pour lire directement les entrées externes — filter_input() pour une valeur unique et filter_input_array() pour plusieurs — qui lisent depuis INPUT_GET, INPUT_POST, INPUT_COOKIE, etc. Utilisez-les plutôt que d'accéder directement à $_GET/$_POST, car elles lisent à partir des données de requête originales même si une superglobale a été modifiée.
Options avancées des filtres PHP
Les filtres PHP proposent également plusieurs options avancées permettant de personnaliser leur comportement. Voici quelques-unes des options les plus couramment utilisées :
- Options de drapeaux : ces options modifient le comportement du filtre, comme exiger un type de données spécifique ou autoriser plusieurs valeurs. Par exemple,
FILTER_FLAG_EMAIL_UNICODEautorise les caractères internationaux lors de la validation d'email. - Fonctions de callback : elles vous permettent de passer une fonction personnalisée à
FILTER_CALLBACKpour une logique de validation ou d'assainissement sur mesure. - Filtrage de tableaux : utilisez
filter_var_array()oufilter_input_array()pour appliquer des filtres à plusieurs variables en même temps, ce qui est particulièrement utile pour traiter des données de formulaire ou des chaînes de requête.
Exemples de filtres PHP
Voici quelques exemples illustrant l'utilisation des filtres PHP dans des situations réelles :
Valider un email en PHP avec filter_var
Dans cet exemple, la fonction filter_var est utilisée pour valider une adresse email. Si l'adresse email est valide, le script affichera "Email is valid", sinon il affichera "Email is not valid".
Assainir une chaîne en PHP avec filter_var
Dans cet exemple, la fonction filter_var est utilisée pour assainir une chaîne. Le filtre FILTER_SANITIZE_FULL_SPECIAL_CHARS supprime ou encode les balises HTML et les caractères spéciaux de la chaîne, produisant une chaîne sûre et propre utilisable dans votre application.
Exemples avancés de filtres PHP
Pour exploiter toute la puissance des filtres PHP, vous pouvez utiliser des callbacks et le filtrage de tableaux :
Filtre PHP avec callback
<?php
function custom_sanitize($str) {
return strtoupper(trim($str));
}
$input = " hello world ";
$result = filter_var($input, FILTER_CALLBACK, ["options" => "custom_sanitize"]);
echo $result; // Outputs: HELLO WORLD
?>Filtrer un tableau de variables en PHP
<?php
$data = [
"email" => "[email protected]",
"age" => "25",
"url" => "https://example.com"
];
$filters = [
"email" => FILTER_VALIDATE_EMAIL,
"age" => ["filter" => FILTER_VALIDATE_INT, "options" => ["min_range" => 1, "max_range" => 120]],
"url" => FILTER_VALIDATE_URL
];
$result = filter_var_array($data, $filters);
print_r($result);
?>Le résultat est :
Array
(
[email] => [email protected]
[age] => 25
[url] => https://example.com
)Si une valeur échoue à son filtre, la clé correspondante contient false au lieu de la valeur, ce qui vous permet d'identifier exactement quel champ était invalide.
Valider un entier dans une plage
Les options min_range et max_range permettent à FILTER_VALIDATE_INT de rejeter les nombres hors limites — utile pour des quantités ou des âges :
<?php
$age = "150";
$options = ["options" => ["min_range" => 1, "max_range" => 120]];
var_dump(filter_var($age, FILTER_VALIDATE_INT, $options)); // bool(false)
?>Comme 150 dépasse max_range, le filtre retourne false même si "150" est une chaîne entière parfaitement valide.
Fournir une valeur par défaut en cas d'échec de validation
La plupart des filtres de validation acceptent une option default, ce qui vous permet de retourner une valeur sûre plutôt que false :
<?php
$price = filter_var("not-a-number", FILTER_VALIDATE_FLOAT, [
"options" => ["default" => 0.0]
]);
var_dump($price); // float(0)
?>Pièges courants
Quelques comportements surprennent les débutants :
falseest une valeur valide. Lorsqu'une valeur est légitimement0ou"0", un test naïfif (filter_var(...))l'interprète comme un échec. Comparez explicitement avecfalseen utilisant l'opérateur strict :if (filter_var($n, FILTER_VALIDATE_INT) === false).- La validation ne modifie pas la valeur.
FILTER_VALIDATE_*retourne votre valeur originale (convertie si nécessaire) oufalse; il n'assainit jamais. Si vous avez besoin d'une chaîne nettoyée, utilisez un filtreFILTER_SANITIZE_*. - La validation d'email ne vérifie pas la délivrabilité.
FILTER_VALIDATE_EMAILvérifie uniquement la syntaxe — il ne peut pas confirmer que la boîte mail existe. AjoutezFILTER_FLAG_EMAIL_UNICODEsi vous acceptez les adresses internationalisées. - L'assainissement n'est pas équivalent à l'échappement pour SQL. Utilisez des requêtes préparées (ou
mysqli_real_escape_string()) pour les requêtes de base de données ; les filtres servent au nettoyage de format, pas à la sécurité des requêtes.
Conclusion
En conclusion, les filtres PHP sont un outil essentiel pour les développeurs web souhaitant valider et assainir les données d'entrée. Grâce aux différents types et options disponibles, vous pouvez facilement adapter vos filtres aux besoins spécifiques de votre application. Que vous souhaitiez valider des emails, supprimer des caractères dangereux ou effectuer une validation personnalisée, les filtres PHP ont tout ce qu'il vous faut.
N'oubliez pas de combiner les filtres avec d'autres mesures de sécurité — requêtes préparées, échappement en sortie et protection CSRF — pour maintenir votre application web aussi sécurisée que possible. Pour un guide complet, consultez Validation de formulaires PHP.