Vous n'êtes pas connecté - 0 membre connecté
Tutoriaux
PHP
Formulaire co...
Formulaire contact
Auteur : Geoffroy
Posté le 03 05 2007 à 00h28
Vu 47510 fois
[PHP5] Filtra...
[PHP5] Filtrage des données, chemin du succès !
Auteur : Phoenix
Posté le 03 04 2007 à 02h03
Vu 10347 fois
Introduction ...
Introduction AJAX/PHP
Auteur : McFly
Posté le 30 07 2006 à 13h37
Vu 27477 fois
Détail du tutorial
PHP > [PHP5] Filtrage des données, chemin du succès !
Difficulté : moyen
Tutorial en 7 étapes
Posté le 03 04 2007 à 02h03

Le filtrage des données est un point très important pour la sécurité de vos applications web.

Comment ne pas se répéter ? Automatiser un peu la chose ?

Je vous propose deux classes de filtrage :
- Phoenix_Filter contient des méthodes statiques des filtrage brut et conditionnel.

- Phoenix_Filter_Form permet d'automatiser un peu la tâche, et ainsi d'éviter tout plein de if .. else, et de vérifications...

Voilà ma propostion sur la chose, elle est pas non plus parfaite et complète à souhait, à vrai dire elle est toute fraîche et doit être encore un peu optimisée...
Phoenix - Membre - www
Introduction
/**
* Télécharger le package .zip à l'addresse suivante :
*
* phoenix17.net
*
* Avant toute chose, veuillez jeter un oeil sur la classe Phoenix_Filter
* Elle contient une panoplie de méthode permettant un filtrage 'brute' et 'conditionnel'.
* J'entend par 'brute' un filtrage direct, qui récupére ce qu'il interesse, donc sans erreur,
* et par 'conditionnel' un filtrage créeant une erreur ou une exception
* lorsque les données ne sont pas correctes.
*
* Méthode de filtrage brute :
* (public) (static) function GetAlpha [return : mixed]
* Méthode de filtrage conditionnel :
* (public) (static) function TestAlpha [return : bool]
*
* Vous pouvez ainsi créer vos propres méthodes (normal je dirais).
* Je vous conseil de créer des méthodes statiques (static) pour
* éviter l'instance inutile et pour y avoir accés partout :
*
* Phoenix_Filter::GetAlpha('A1B2C3');
* // return : ABC
*
* La classe Phoenix_Filter_Form ne manque pas de commentaires et description ! (enfin je pense)
*
*/
Instance de la classe Phoenix_Filter_Form
 

<?
/**
 * Commençons par inclure les classes
 * Notez que vous n'êtes pas obligé de charger Phoenix/Filter.php
 * si vous charger Phoenix/Filter/Form.php (il est charger dedans)
 */
require_once("Phoenix/Filter.php");
require_once(
"Phoenix/Filter/Form.php");

try {
/**********************************************************************
 ********************************************************************** 
 * I - Créons une instance de la classe :
 * Argument 1 : language des erreurs et exception (par défaut fr_FR)
 * Argument 2 : le type de gestion d'erreurs pour lequel vous avez opté :
 *                 - -1 : aucune gestion d'erreur, se contente de filtrer (plus rapide)
 *                 - true : lance une exception lorsque une données est invalide 
 *                          (arrête le script à la première erreur)
 *                 - false (par défaut) : ajoute l'erreur dans un tableau (array)
 *                          Vous pouvez donc l'utiliser pour intégrer la liste des erreurs
 *                          dans votre page web, par un simple foreach
 * Pour une plus grande lisibilité, vous pouvez utiliser les constantes suivantes (dans l'ordre)
 *                 Phoenix_Filter_Filter::E_USER_NONE
 *                 Phoenix_Filter_Filter::E_USER_EXCEPTION
 *                 Phoenix_Filter_Filter::E_USER_ARRAY
 */
$_filter = new Phoenix_Filter_Form('uk_UK',Phoenix_Filter_Form::E_USER_ARRAY);
?>    
Filtrage des données
 

<?
/**********************************************************************
 * [b]Filtrage à partir d'un tableau[/b]
 * Vous verrez plus tard que cette méthode est plus facile 
 * d'utilisation du fait que l'on assigne des valeurs grâce à un
 * tableau associatif, ça gagne donc en lisibilitée !
 */
$aMyForm = array(

    
/**
     * Doit être alphabétique (filtrage brut)
     * La longueur de la chaine doit être entre 2 et 7 caractères,
     * une erreur ou exception sera lancée si cette chaine est plus ou moins longue.
     * Ce champ est obligatoire, une erreur ou exception sera lancée si il est vide.
     */
    
'Champ1' => array('data'    => "abc3d4e",  // ici retournera : abcde
                      
'filter'  => 'GetAlpha',
                      
'lenght'  => array('MIN' => 2'MAX' => 7),
                      
'notnull' => true ),
    
/**
     * Doit être alpha-numérique (filtrage conditionnel)
     * La longueur de la chaine ne doit pas dépassé 15 caractères
     * une erreur ou exception sera lancée si cette chaine est plus longue.
     * Ce champ est facultatif, vous pouvez aussi ne pas omettre la ligne 'notnull'
     */    
    
'Champ2' => array('data'    => "abc3d/*4e"// ici retournera : abc3d4e
                      
'filter'  => 'TestAlnum'
                      
'lenght'  => array('MAX'=>15), 
                      
'notnull' => false ),

    
/**
     * Doit être numérique (filtrage conditionnel)
     * Aucune limite sur la longueur de la chaine.
     * Ce champs est facultafif
     */                    
    
'Champ3' => array('data'    => "abc3d4e"
                      
'filter'  => 'TestDigit' ),                                                    
                
); 
// end aMyForm

/**
 * Après avoir définit nos filtres, 
 * passons à l'inspection des données avec la méthode inspectArray().
 */
$_filter->inspectArray($aMyForm);


/**********************************************************************
 * [b]Filtrage direct [/b]
 * Cette méthode est plus rapide à utiliser, mais moins lisible
 * si vous utiliser le deux derniers argument optionnels lenght et notnull :
 */
    
$_filter->inspectElement('Champ1''abc3d4e'    'GetAlpha' , array('MIN' => 2'MAX' => 7), true);
    
    
$_filter->inspectElement('Champ2''abc3d/*4e'    'TestAlnum', array('MAX' => 15), true);
    
    
$_filter->inspectElement('Champ3''abc3d4e'    'TestDigit');
    
?>
Récupération des données filtrées
 

<?
/**********************************************************************
 ********************************************************************** 
 * Récupération des données filtrées :
 */
/**
 * [b]Récuperer les données comme un objet :[/b]
 */
echo $_filter->Champ1// retournera 'abcde' dans notre exemple

/**
 * [b]Récuperer les données comme un tableau :[/b]
 */
$MyFilteredChamps $_filter->getFiltered();

echo 
$MyFilteredChamps['Champ1']; // retournera 'abcde' dans notre exemple

?>
Récupération des erreurs
 

<?
/**********************************************************************
 ********************************************************************** 
 * Récupération des erreurs :
 * Note : il faut définir le deuxiemme argument du constructeur à E_USER_ARRAY ou false
 */

/**
 * [b]Récuperer le nombre d'erreur enregistrés[/b]
 */
echo "Il y a <strong>".$_filter->countError()."</strong> erreur(s) !";

/**
 * [b]Récuperer les erreurs pour un affichage personnalisé[/b]
 */
$MyListError $_filter->getUserError();

foreach (
$MyListError as $sError 
{
    echo 
'<strong>' $sError '</strong><br/>';
}
?>
Récupération des éventuelles exceptions
 

<?
/**********************************************************************
 ********************************************************************** 
 * On récupere les exceptions lancées
 */
} catch(Phoenix_Filter_Exception $e)
{
    echo 
$e->GetMessage();
}
?>
Conclusion
Il devient plus facile de gérer le filtrage et les erreurs...

Cette classe est encore jeune, et elle ne prétend pas être LA solution à tous les problèmes :)

En éspérant vous avoir aidé,

il se fait tard, dodo ;)

Commentaires
C'est une bonne initiative, je vais y jeter un oeil !

Merci,
Matou
Commentaire Posté le 03 04 2007 à 11h59
caniche - Membre - www
note : je viens de me rendre compte que les fonctions ctype_XXX, bien que plus rapide, ne filtrent pas correctement. Je vais donc les remplacer par preg_match
Commentaire Posté le 03 04 2007 à 19h05
Phoenix - Membre - www
Partenaires

Catégories
After Effects
1 Tutorial
Flash
2 Tutoriaux
Lightwave
1 Tutorial
Divers
1 Tutorial
Photoshop
15 Tutoriaux
Illustrator
4 Tutoriaux
Indesign
2 Tutoriaux
PHP
3 Tutoriaux
Blender
1 Tutorial
Mentions légales   -   Crédits   -   Nous contacter   -   © Benzor 2006