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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Comment nettoyer automatiquement et correctement $_POST ?


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2015
    Messages : 59
    Par défaut Comment nettoyer automatiquement et correctement $_POST ?
    Bonjour,

    Jusqu'à présent, j'utilisais une fonction pour nettoyer la variable $_POST

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function cleanPost() {
        global $_POST;
        foreach ($_POST as $key => $value) {
            $_POST[$key] = filter_input($value, FILTER_SANITIZE_STRING);
        }
    }

    Sauf qu'aujourd'hui je reçois le résultat d'un formulaire ressemblant à ceci:

    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     <form name="clients" type="POST" action="./traiteClients.php">
    <input type="text" name="client[]" value="Jean">
    <input type="text" name="client[]" value="Jacques">
    <input type ="submit">
    </form>


    si je ne nettoie pas la variable d'environnement, son contenu correspond à ce qui est attendu:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    array(1) { ["client"]=> array(2) { [0]=> string(4) "Jean" [1]=> string(7) "Jacques"}

    Par contre, après nettoyage j'obtient ceci:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    array(1) { ["client"]=> bool(false) }

    Ceci m'amène à vous poser deux questions:
    • comment dois-je faire pour nettoyer la variable sans perdre le tableau qu'elle contient ?
    • est-il possible de réécrire la fonction de façon à ce qu'elle analyse le type de donnée reçue et fasse le nettoyage adapté ? (c'est une fonction que j'appelle au début de tous mes programmes).



    Merci pour vos réponses.

  2. #2
    Membre chevronné Avatar de Freudd
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 165
    Par défaut
    Bonjour Louprouge,

    Déjà félicitation tu utilises une bonne fonction pour le nettoyage de tes variables or l'utilisation d'une variable global $_POST qui doit-être éviter à tous pris.
    Mais comme tu as pu t'en rendre compte il y a des cas ou cela est insuffisant.

    La méthode que j'utilise depuis quelques années est l'utilisation d'un Validator de données (il en existe plusieurs sur github à toi de faire ton choix :p)

    Mais si tu veux juste régler le problème que tu as là maintenant il faut que tu te renseigne sur la fonction suivante : https://www.php.net/manual/fr/functi...nput-array.php

  3. #3
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    Salut, il n'est pas nécessaire de vider $_POST, c'est effectué automatiquement au changement de page.
    Sinon : unset($_POST).

  4. #4
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    oops, j'ai mal vu la question.

    Dans quel contexte veux-tu garder la structure de ton $_POST ?

    Est-ce que tu ne peux pas stocker la structure vide avant de valider ton form ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2015
    Messages : 59
    Par défaut
    @Freudd: je vais chercher après un validateur de données... Mais si tu connais, peut-être en utilises tu un au quotidien qui vaudrait la peine qu'on y jette un œil ?



    @ma5t3r : je ne comprend pas bien ta question. En gros, je vais recevoir un formulaire qui est une liste dont je ne connais pas à l'avance le nombre d'entrées. Une façon de le traiter, c'est de la recevoir sous forme de tableau et de le parcourir en foreach().

    Ne connaissant pas le nombre d'entrées, la déclaration html du formulaire se fait sous la forme :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="text" name="toto[]">

    Ce qui revient à créer le tableau dans la page web (éventuellement en gérant les ajouts/retraits en javascript)

    Lorsque je reçois le formulaire côté php , c'est dans $_POST et $_POST['toto'] est un sous tableau de $_POST.


    J'utilise une fonction générique que j'ai pompeusement appelé [c=php]sanitize()/c] qui doit, de façon générale, passer $_POST en revue, nettoyer le contenu de chacune de ses entrées afin que je puisse, plus tard, traiter le contenu sans me tracasser des saloperies qu'on pourrait y avoir glissé.

    Utiliser $_POST me permet d'invoquer ma fonction en tête de n'importe quel vieux code sans avoir à modifier celui-ci et passer par une fonction générale me permet d'améliorer celle-ci avec le temps ... Temps qui semble se présenter maintenant puisque si une entrée de $_POST est un tableau, ma fonction ne ... fonctionne plus

    ==> le caractère général de ma fonction fait qu'elle travaille directement sur $_POST==> si je dois le manipuler moi même dans chaque programme, mon outil devient caduque et dépendant.

  6. #6
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    Il suffit de tester si ton élément est un tableau avant de le traiter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		foreach ($_POST as $key => $value) :
    			is_array($value) ? "tableau" : "pas tableau";
    		endforeach;

  7. #7
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    3 003
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 3 003
    Par défaut
    Cette fonction est une fausse bonne idée. Le problème que tu rencontres en est une illustration.
    Appliquer un même filtre sur toutes les données sans distinction n'a pas de sens: si on part du principe que les données reçues peuvent être diverses et variées, à quoi bon créer une fonction qui va appliquer toujours le même traitement? La nature des informations transmises et les besoins peuvent être différents: il s'agit donc d'adapter ce traitement à chaque type de données.
    D'autre part, appliquer d'entrée de jeu un filtre de nettoyage peut masquer le fait que les données ne proviennent pas de ton formulaire. Dans ce cas est-il encore pertinent de continuer à traiter les données reçues comme si de rien n'était?

    Travailler directement sur la variable $_POST est aussi problématique, car elle représente les données reçues (par la méthode POST). En la modifiant, elle perd ce rôle pour le reste du script et en l'utilisant dans la suite du script elle indique une provenance dont on se moque éperdument. Donc du point de vue sémantique, mieux vaut affecter ses valeurs à d'autres variables (quitte à en regrouper en tableau ou en objet) dont le nom fait sens avant toute modification.

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2015
    Messages : 59
    Par défaut
    @CosmoKnacki : J'entends bien tous tes arguments et ils sont effectivement fondés.

    Dans le cas qui m'occupe, le but est de se débarrasser du travail fastidieux, répétitif et risqué de nettoyer systématiquement les données reçues.
    L'idée de base étant que si je programme ce nettoyage dans chaque fichier php, le jour ou il faut modifier, corriger ou améliorer cette méthode, il faut repasser dans chaque programme individuellement.

    A contrario, si c'est la même fonction qui est appelée partout, les modifications se feront en une fois et seront disponibles partout en même temps.

    Je pourrais travailler sur une copie de $_POST[] mais dans ce cas je ne pourrais pas invoquer ma fonction en début de fichier dans les anciens programmes que j'ai écris. Par contre, je peux lui passer un paramètre pour qu'elle travaille sur $_POST[] ou qu'elle renvoi une copie du tableau.

    La solution de ma5t3r est une piste intéressante, non ? Appliquer le filtre de nettoyage en fonction du type de donnée reçue , quitte à réanalyser ce type avant traitement pour être certain qu'on attends ce genre de donnée ?


    @ma5st3er : Cela va compliquer ma fonction mais je crois que c'est la bonne piste, quitte à écrire la fonction de façon récursive.

  9. #9
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    A mon avis, tu vas te traîner un boulet tout au long de la vie de ton appli.
    Il faut laisser à $_POST ce qui appartient à $_POST :-)

Discussions similaires

  1. Réponses: 11
    Dernier message: 20/09/2007, 15h51
  2. [JavaScript] [FAQ][correction] Comment passer automatiquement au champ suivant
    Par Auteur dans le forum Contribuez
    Réponses: 10
    Dernier message: 14/12/2006, 19h18
  3. Comment détecté automatiquement Une base erronée.
    Par ada_b dans le forum Débuter
    Réponses: 4
    Dernier message: 13/01/2005, 08h56
  4. [Internet] Comment lancer automatiquement la connexion ?
    Par laayouni_mus dans le forum Web & réseau
    Réponses: 4
    Dernier message: 10/09/2004, 21h14
  5. [JDevelopper] Comment indenter automatiquement le code ??
    Par Bicnic dans le forum JDeveloper
    Réponses: 5
    Dernier message: 03/08/2004, 22h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo