IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Le filtrage et l'échappement des données en PHP 5 : introduction à la technique du Poka-Yoké

Date de publication : 5 juin 2007


III. Exemples
III-A. Formulaire de login
III-B. Formulaire d'enregistrement


III. Exemples

Le meilleur moyen d'apprendre à utiliser le framework est de voir quelques exemples.

info Un lien vers la documentation se trouve en fin d'article.

III-A. Formulaire de login

Prenons comme premier exemple un formulaire de login avec la méthode POST et composé des champs suivants :
  • login : Le nom d'utilisateur ;
  • password : Le mot de passe ;
  • persistant : Si l'utilisateur souhaite rester connecté de manière permanente grâce à ses cookies.
Ce qui nous intéresse ici est le type de chacun des champs. Nous aurons vraisemblablement une variable String contenant un ou plusieurs mots, une autre contenant une valeur String quelconque et enfin une checkbox simple.

Voici ce que cela peut donner en PHP :
Login.php
<?php

class Login extends DVP_DataFilter
{
    public function __construct()
    {
        parent::__construct($_POST);
        unset($_POST);

        $whiteValues = array('yes');

        $this->filterSingleLine('login');
        $this->untaint('password');
        $this->filterUsingArray('persistant', $whiteValues, DVP_DataFilter::ARRAY_STRINGS);

        $this->clean();
    }
}

?>
Le traitement (méthode 1) :
<?php

if(!empty($_POST))
{
    //
    // Initialisation
    //
    $_POST = new Login();


    //
    // Utilisation
    //
    $sql = 'SELECT id
            FROM user
            WHERE login = "'.$_POST->getSQL('login').'"
            AND password = "'.md5($_POST->getRaw('password')).'"';

    $result = mysql_query($sql);
    if($user = mysql_fetch_assoc($result))
    {
        echo 'Connecté en tant que '.$_POST->getHTML('login').'<br />';
        if(!$_POST->isEmpty('persistant'))
        {
            // sessions...
        }
    }

    echo '<br /><br />';
}

?>
Le traitement (méthode 2) :
<?php

if(!empty($_POST))
{
    //
    // Initialisation
    //
    $_POST = new Login();


    //
    // Utilisation
    //
    foreach($_POST as $field)
    {
        echo '<b>'.$field.'</b> : '.$_POST->getHTML($field).'<br />'."\n";
    }

    echo '<br /><br />';
}

?>
Le formulaire :
<form method="post" action="">
    <label><input type="text" name="login" /> Nom d'utilisateur</label><br />
    <label><input type="password" name="password" /> Mot de passe</label><br />
    <label><input type="checkbox" name="persistant" value="yes" /> Rester connecté ?</label><br />

    <input type="submit" value="Envoyer" />
    <input type="reset" value="Rétablir" />
</form>
idea J'imagine que vous voyez où je veux en venir : chaque formulaire HTML dispose d'un équivalent en PHP : une classe qui hérite de la classe DVP_DataFilter.

III-B. Formulaire d'enregistrement

Je ne vais proposer ici qu'un formulaire minimal. En situation réelle, il faudrait davantage de champs, comme par exemple un captcha et un timestamp. Ce n'est cependant pas l'objet de cet article, je laisse donc le soin à d'autres personnes de rentrer dans le détail.

Liste des champs :
  • login : Le nom d'utilisateur ;
  • password_1 : Le mot de passe ;
  • password_2 : La vérification du mot de passe ;
  • signature : La signature à afficher dans les forums ;
  • website : L'adresse du site Web ;
  • e_mail : L'adresse e-mail ;
  • avatar : Le fichier image de son avatar ;
  • portrait : Le fichier image de son portrait.
Ce formulaire contient à la fois des données texte et des fichiers, nous aurons donc besoin de plusieurs classes PHP pour tout couvrir (à l'image de $_POST et $_FILES).
RegisterDataFilter.php
<?php

class RegisterDataFilter extends DVP_DataFilter
{
    public function __construct()
    {
        parent::__construct($_POST);
        unset($_POST);

        $this->filterSingleLine('login');
        $this->untaint('password_1');
        $this->untaint('password_2');
        $this->untaint('signature');
        $this->filterURI('website');
        $this->filterEmail('e_mail');

        $this->clean();
    }
}

?>
RegisterFilesFilter.php
<?php

class RegisterFilesFilter extends DVP_HTTPUploadFilter
{
    public function __construct()
    {
        parent::__construct($_FILES);
        unset($_FILES);

        $this->filterSingleLine('login');
        $this->untaint('password_1');
        $this->untaint('password_2');
        $this->untaint('signature');
        $this->filterURI('website');
        $this->filterEmail('e_mail');

        $this->clean();
    }
}

?>

Bien entendu, ce n'est ici qu'une base de départ. En situation réelle, il faudrait s'adapter à ce que l'internaute saisit effectivement dans le formulaire, par exemple la présence ou l'omission de "http://" pour l'adresse de son site Web.

 

Valid XHTML 1.1!Valid CSS!

Copyright © 2006 Guillaume Rossolini. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.