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.
|
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 ))
{
$_POST = new Login();
$ 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 ' ))
{
}
}
echo ' <br /><br /> ' ;
}
?>
|
Le traitement (méthode 2) : |
<?php
if (! empty($ _POST ))
{
$_POST = new Login();
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 >
|
|
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.
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.