Utilisation pratique des filtres en PHP

Dans cette leçon, nous allons voir les cas les plus courants d’utilisation des filtres en PHP en situation « réelle ». Nous allons donc construire un formulaire HTML et allons utiliser les filtres pour filtrer les données suivantes :

  • Utiliser les filtres PHP pour valider une adresse IP ;
  • Utiliser les filtres PHP pour nettoyer et valider une adresse mail ;
  • Utiliser les filtres PHP pour nettoyer et valider une URL.

Nous discuterons également des limites des filtres et de ce que les filtres ne peuvent ou ne doivent pas faire.

 

Valider une adresse IP

Commençons par l’exemple le plus facile qui consiste en une simple validation d’adresse IP. Pour valider une adresse IP, on va utiliser le filtre validate_ip.

Nous allons ici vouloir valider des données externes pour rendre l’exemple plus réel et allons donc créer un formulaire HTML très simple qui va contenir un champ de texte demandant une adresse IP.

On va ensuite utiliser la fonction filter_input() dont le rôle est de récupérer une variable externe pour la filtrer.

<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <form method='post' action='cours.php'>
            <label for='ip'>Entrez une IP ici :</label>
            <input type='text' id='ip' name='ip'>
            
            <input type='submit' value='Envoyer'>
        </form>
        <?php
            //On vérifie déjà qu'une donnée ait bien été envoyée
            if(isset($_POST['ip'])){
                if(filter_input(INPUT_POST, 'ip', FILTER_VALIDATE_IP)){
                    echo $_POST['ip']. ' ressemble à une IP valide <br>';
                }else{
                    echo $_POST['ip']. ' ne ressemble pas à une IP valide <br>';
                }
            }
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

Utilisation des filtres PHP pour valider une IP

Ici, les données de notre formulaire sont renvoyées vers la page courante avec action='cours.php' qui est la page qui abrite le formulaire. On utilise la méthode post pour envoyer les données qui vont donc être stockées dans la superglobale $_POST.

Dans notre script PHP, on commence déjà par s’assurer que notre superglobale $_POST contient bien un élément ip. C’est le rôle de la première instruction if englobante. Si ce n’est pas le cas, on ne rentre pas dans le if et rien ne sera affiché.

Si notre variable $_POST['ip'] a bien été définie, on va alors tester que la valeur passée a bien la forme d’une adresse IP. Notez que les filtres de validation ne servent bien sûr qu’à vérifier la concordance de forme et non pas dans le cas présent si l’IP existe vraiment et a été attribuée à quelqu’un.

Lorsqu’on utilise la fonction filter_input(), il faut préciser le nom simple de la donnée qu’on souhaite filtrer plutôt que l’emplacement de la valeur dans la superglobale. Cela est dû au fait que le premier argument de la fonction permet déjà de préciser d’où vient la donnée.

Pour une validation d’IP plus stricte, on aurait pu également utiliser les drapeaux FILTER_FLAG_IPV4 et FILTER_FLAG_IPV6 qui permettent de valider respectivement une IPv4 et une IPv6.

 

Nettoyer et valider une adresse mail

Pour vérifier la validité d’une adresse email envoyée par un utilisateur en utilisant les filtres PHP, nous allons pouvoir procéder en deux étapes en commençant par nettoyer les données envoyées en supprimant tous les caractères « illégaux » envoyés (une espace, une virgule, etc.) puis en vérifiant que les données restantes ont bien la forme d’une adresse email.

Une nouvelle fois, nous n’allons pas pouvoir nous assurer que l’adresse email envoyée existe bien de cette manière, nous allons simplement pouvoir vérifier que les données envoyées ont la forme d’une adresse email (présence d’un symbole « @ » par exemple).

Pour illustrer cela, nous allons cette fois-ci créer un champ d’input de type email dans notre formulaire.

Notez que la plupart des navigateurs effectuent déjà une vérification sur les données passées dans les input type='email' et vérifient notamment la présence du caractère « @ » suivi par au moins une lettre.

Les filtres vont nous permettre d’aller plus loin. Si vous souhaitez pouvoir inscrire n’importe quoi dans le champ mail du formulaire pour bien vérifier votre filtre, vous pouvez créer un champ de type text plutôt que email.

<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <form method='post' action='cours.php'>
            <label for='mail'>Entrez une adresse mail ici :</label>
            <input type='email' id='mail' name='mail'><br>
            
            <input type='submit' value='Envoyer'>
        </form>
        <?php
            //On vérifie déjà qu'une donnée ait bien été envoyée
            if(isset($_POST['mail'])){
                $m = filter_input(INPUT_POST, 'mail', FILTER_SANITIZE_EMAIL);
                echo 'Valeur retenue : ' .$m.
                     '<br> Valeur originale : ' .$_POST['mail']. '<br>';
                if(filter_var($m, FILTER_VALIDATE_EMAIL)){
                    echo $m. ' ressemble à une adresse mail valide <br>';
                }else{
                    echo $m. ' ne ressemble pas à une adresse mail valide <br>';
                }
            }
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

Utilisation des filtres PHP pour nettoyer et valider une adresse mail

Ici, on commence par utiliser un premier filtre de nettoyage FILTER_SANITIZE_EMAIL puis on récupère le résultat (la valeur filtrée) dans une variable $m.

On utilise ensuite un filtre de validation pour nous assurer que l’adresse contenue dans $m a bien la forme d’une adresse mail valide. On utilise ici filter_var() plutôt que filter_input() car notre variable $m a été définie en interne.

 

Nettoyer et valider une URL

On va pouvoir de la même façon qu’avec nos adresses mail pouvoir filtrer des URL. Pour illustrer cela, on peut reprendre le code précédent et ajuster les filtres et les noms des variables :

<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <form method='post' action='cours.php'>
            <label for='url'>Entrez une URL ici :</label>
            <input type='url' id='url' name='url'><br>
            
            <input type='submit' value='Envoyer'>
        </form>
        <?php
            //On vérifie déjà qu'une donnée ait bien été envoyée
            if(isset($_POST['url'])){
                $url = filter_input(INPUT_POST, 'url', FILTER_SANITIZE_URL);
                echo 'Valeur retenue : ' .$url.
                     '<br> Valeur originale : ' .$_POST['url']. '<br>';
                if(filter_var($url, FILTER_VALIDATE_URL)){
                    echo $url. ' ressemble à une URL valide <br>';
                }else{
                    echo $url. ' ne ressemble pas à une URL valide <br>';
                }
            }
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

Utilisation des filtres PHP pour nettoyer et valider une URL

 

Les limites des filtres

Les filtres sont un bon outil pour s’assurer qu’une valeur possède une forme attendue ou pour échapper ou supprimer certains caractères problématiques d’une valeur.

Cependant, les filtres sont loin d’être parfaits et ne vont pas pouvoir être utilisés pour vérifier des données dans n’importe quelle condition.

Typiquement, les filtres vont être performants lorsqu’on souhaite afficher des données traitées dans une page web car la plupart des filtres se concentrent sur l’échappement des balises HTML et de certains caractères pouvant poser des problèmes lors d’un affichage.

En revanche, on ne pourra pas se reposer uniquement sur les filtres pour l’enregistrement de données en base de données par exemple, tout simplement car les filtres vont laisser passer certains caractères et schémas qui vont être potentiellement dangereux.

Laisser un commentaire