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 :

prefixe et extract() [PHP 5.0]


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut prefixe et extract()
    Bonjour,

    Je me demande si il est interessant de faire ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extract($_GET,EXTR_PREFIX_ALL,"get");
    Ce qui permet d'appeller ses variables envoyees en GET (on peut imaginer la meme chose pour d'autres variables superglobales) de la facon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $get_monElement 
     
    //au lieu de 
     
    $_GET["monelement"]
    J'ai lu quelque part qu'il etait mieux d'extraire ses variables get et post avant traitement mais j'aimerai avoir confirmation

    D'avance merci.
    Spécialité : Développement WEB
    Indispensables : Doc PHP ~ Doc MySQL ~ w3schools ~ validateurs W3C ~ Google Adwords ~ PHP-Tester


  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 194
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 194
    Points : 8 409
    Points
    8 409
    Billets dans le blog
    17
    Par défaut
    A moins de structurer fortement ton appli je ne vois pas l'intérêt, en plus les variables créées ne sont pas superglobales.

    J'ai lu quelque part qu'il etait mieux d'extraire ses variables get et post avant traitement
    Quels arguments étaient donnés ?
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    Il me semble que la l'argument était que la conversion des tableaux $_GET et $_POST en variables accentuaient la sécurité. Je suis perplexe egalement car je n'en retrouve pas le sens, c'est pourquoi je vous rapporte cette problematique, histoire de savoir si vous en savez plus.
    Spécialité : Développement WEB
    Indispensables : Doc PHP ~ Doc MySQL ~ w3schools ~ validateurs W3C ~ Google Adwords ~ PHP-Tester


  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 194
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 194
    Points : 8 409
    Points
    8 409
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par keaton2000 Voir le message
    Il me semble que la l'argument était que la conversion des tableaux $_GET et $_POST en variables accentuaient la sécurité.
    Je ne vois pas en quoi, au contraire même. Tu sais d'où vient $_POST['field'], au contraire de $field ou $post_field

    Je suis perplexe egalement car je n'en retrouve pas le sens, c'est pourquoi je vous rapporte cette problematique, histoire de savoir si vous en savez plus.
    N'aurais-tu pas un lien vers l'article ? Il y a peut-être des raisons auxquelles je ne pense pas.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  5. #5
    FoxLeRenard
    Invité(e)
    Par défaut
    Citation Envoyé par keaton2000 Voir le message
    Il me semble que la l'argument était que la conversion des tableaux $_GET et $_POST en variables accentuaient la sécurité. Je suis perplexe egalement car je n'en retrouve pas le sens, c'est pourquoi je vous rapporte cette problematique, histoire de savoir si vous en savez plus.
    Puis-qu' il faut un des coupable, il y a clairement moi,
    j' avais travaillé depuis longtemps cette question, mais en lisant les derniers livres PHP MYSQL ==> La sécuritée, il apparait clairement ceci:

    Les Buffers des variables de Session, de POST ou GET de FILES etc ...
    sont fragiles et pour partie violables, alors que PHP n'ayant aucune variable externe, toute variable d'un PHP ne peut étre atteinte.

    L' idée est donc, dés le début de chaque page PHP qui en a besoins, de gérer la totalitée de ces ressources, session POST etc...
    de les sécuriser de suite dans des variables.

    ensuite on ne fais plus qu' utiliser les variables.

    Combien de script postés ici sécurisent par exemple $_POST puis 10 lignes plus loins injectent le même $_POST dans leur MYSQL


    Donc moi en haut de mes pages j'ais toujours ce genre la

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    <?PHP
    session_start();
    if (!isset($_SESSION['LeSon']))   {$_SESSION['LeSon']="N";$LeSon="N";}
         else {$LeSon=$_SESSION['LeSon'];}
    if (isset($_POST["avant13"])) $avant13=trim($_POST["avant13"]);
        else $avant13="";
     
    if ($avant13!="") { //==========etc ...}
    De toute façon OK ou pas avec moi, on ne peut de toute façon pas affirmer que ma méthode soit moins-sure

  6. #6
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    Merci pour ta reponse, si je suis ton exemple, extract est plutot inutile, puisqu'il ne fait aucun traitement des chaines. A la rigueur, il faudrai plutot faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $post = array();
    foreach($_POST as $cle=>$valeur) {
     
      $post[$cle] = trim($valeur);
     
    }
    Dans ce cas, on utilise un array(), donc selon ton histoire de buffer, c'est securise, ou plus qu'une variable superglobale, et on realise un traitement en plus.

    D'ailleurs que penses-tu du tableau $GLOBALS, je l'utilise baucoup pour stocker les objets que je reutilise dans la page (connexions persistantes a la bdd, fonctions sur les chaines, etc...) ?
    Spécialité : Développement WEB
    Indispensables : Doc PHP ~ Doc MySQL ~ w3schools ~ validateurs W3C ~ Google Adwords ~ PHP-Tester


  7. #7
    FoxLeRenard
    Invité(e)
    Par défaut
    Citation Envoyé par keaton2000 Voir le message
    Merci pour ta reponse, si je suis ton exemple, extract est plutot inutile, puisqu'il ne fait aucun traitement des chaines. A la rigueur, il faudrai plutot faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $post = array();
    foreach($_POST as $cle=>$valeur) {
     
      $post[$cle] = trim($valeur);
     
    }
    Dans ce cas, on utilise un array(), donc selon ton histoire de buffer, c'est securise, ou plus qu'une variable superglobale, et on realise un traitement en plus.

    D'ailleurs que penses-tu du tableau $GLOBALS, je l'utilise baucoup pour stocker les objets que je reutilise dans la page (connexions persistantes a la bdd, fonctions sur les chaines, etc...) ?
    La encore avis personnel, on a intéret a avoir des noms a sois du reste il me semble que PHP 6 a arrété cette notion mais j'suis pas certain

    Pour les taritements de ces variables dans ce que j'ais dit, bien sur en fonction de ce que j'attends je sécurise chaque variable !! mais la je ne pouvais dire par quoi puique ça dépend de la nature !!


    Je reviens a la notion de globale,

    Si dans mes pages PHP je n'ais jamais de fonctions, je n'utilises donc pas l'un des aspect de la notion de variable globale : rendre une variable accessible
    dans mon PHP .

    Par ailleur au sens d'un ordinateur il y a des globales au sens de variables d'environnement.

    Le visiteur lui "trimbale" aussi ces variables IP etc ... ...

    Tout cela ne doit pas préter a confusion avec la notion de GLOBAL

    On peut je penses que tu sera ok avec moi résumer ça ainsi:

    Variables de l' utilisateur

    - la valeur des cookies
    - des variables de sessions
    - ses caractéristiques

    Variables d environement

    - des variables d'environnement
    - des variables de serveurs

    Donc ...

    $_GET Récupération des variables d'un formulaire GET ou d' URL
    $_POST Récupération des variables passées par un formulaire POST
    $_FILES Récupération des variables de fichiers envoyés par un formulaire
    $_COOKIE Récupération des valeurs des cookies
    $_SESSION Récupération des variables de session
    $_ENV Récupération des variables d'environnement
    $_SERVER

    Coté global pur,
    Depuis la version 4.2.0 de PHP, cette option est par défaut initialisée à OFF
    donc on ne peut plus faire avec :

    http://www.fox-infographie.com/index.php?mavar=okboss

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    <?php echo 'voila directement '.$mavar;>
    qui affichait "voila directement okboss"

    bon voila un peut pour te répondre
    Dernière modification par FoxLeRenard ; 06/05/2009 à 05h27.

  8. #8
    FoxLeRenard
    Invité(e)
    Par défaut
    Citation Envoyé par Séb. Voir le message
    A moins de structurer fortement ton appli je ne vois pas l'intérêt, en plus les variables créées ne sont pas superglobales.
    Quels arguments étaient donnés ?
    Oui SEB !! les variables créées ne sont pas superglobales. du reste aucune variable en fait ...

    mais j'en remets une couche en rappelant pour ceux qui accepteraient que register_globals soit a ON.
    Dernière modification par E.Bzz ; 27/10/2010 à 12h22. Motif: LE

  9. #9
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    Autre possibilité pour accéder à ses variables partout dans le code, utiliser une classe de ce genre :

    http://www.developpez.net/forums/d67...f/#post4034536

    Evidemment, si on utilise le format RAW pour mettre dans ses requetes SQL, on n'est toujours pas à l'abri, mais au moins l'erreur saute aux yeux à la relecture en principe.

    Inconvénient, ça alourdit un peu le code... même si la classe a été écrite dans l'idée de minimiser au maximum le nombre de caractères a écrire, je n'ai pas trouvé comment faire mieux ;o)

  10. #10
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    Pour les traitements de ces variables dans ce que j'ais dit, bien sur en fonction de ce que j'attends je sécurise chaque variable !! mais la je ne pouvais dire par quoi puique ça dépend de la nature !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    function securiserTableau($tableau) {
     
    	$tabRetour = array();
    	foreach($tableau as $cle=>$valeur) {
     
    		if (is_string($valeur)) {
     
    			$tabRetour[$cle] = trim($valeur);
     
    		} else if (is_array($valeur)) {
     
    			$tabRetour[$cle] = securiserTableau($valeur);
     
    		} else {
     
    			$tabRetour[$cle] = $valeur;
     
    		}
     
    	}
     
    	return $tabRetour;
     
    }
     
    $post = securiserTableau($_POST)
     
    extract($post,EXTR_PREFIX_ALL,"post");
    Quand tu parles de leur nature, tu veux dire leur type ? Si c'etait cela ton conseil, j'ai modifie mon bout de script en conséquence ... qui traite les sous chaines contenues dans des tableaux du tableau initial. Ceci dit, même si ce n'est pas le cas, c'est toujours mieux comme ca. Pour les "noms a moi", c'est toujours le cas puisque le formulaire derriere est de moi, donc un extract ensuite fait l'affaire.

    Merci pour ton topo sur les variables globales, ceci dit, je n'utilise pas "register_globals" qui effectivement est supprime en PHP6, cf doc : http://us3.php.net/manual/fr/security.globals.php

    Pour le tableau $GLOBALS, il n'y a pas de confusions . Je me demandais surtout ce qu'il en etait au niveau securite des donnees qui y sont. Je parle de ce tableau :

    Le tableau $GLOBALS est un tableau associatif avec le nom des variables globales comme clé et les valeurs des éléments du tableau comme valeur des variables. Notez que $GLOBALS existe dans tous les contextes, car $GLOBALS est un superglobal.
    http://us3.php.net/manual/fr/languag...bles.scope.php
    Spécialité : Développement WEB
    Indispensables : Doc PHP ~ Doc MySQL ~ w3schools ~ validateurs W3C ~ Google Adwords ~ PHP-Tester


  11. #11
    FoxLeRenard
    Invité(e)
    Par défaut
    Citation Envoyé par Fladnag Voir le message
    Autre possibilité pour accéder à ses variables partout dans le code, utiliser une classe de ce genre :
    http://www.developpez.net/forums/d67...f/#post4034536
    Super ton code, j'ais mis ça de coté !!
    Dernière modification par FoxLeRenard ; 06/05/2009 à 12h18.

  12. #12
    FoxLeRenard
    Invité(e)
    Par défaut
    Citation Envoyé par keaton2000 Voir le message
    Quand tu parles de leur nature, tu veux dire leur type ? Si c'etait cela ton conseil, j'ai modifie mon bout de script en conséquence ... qui traite les sous chaines contenues dans des tableaux du tableau initial. Ceci dit, même si ce n'est pas le cas, c'est toujours mieux comme ca. Pour les "noms a moi", c'est toujours le cas puisque le formulaire derriere est de moi, donc un extract ensuite fait l'affaire.
    Oui en tout cas a force de s'écouter je vois que nous sommes OK 100%

  13. #13
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    Super ton code, j'ais mis ça de coét !!
    Le mien ou celui du lien ?

    Oui en tout cas a force de s'écouter
    Je suis la pour ca.

    Pour en revenir a la question initiale, on peut dire que l'extraction est utile uniquement pour la lisibilite du code, et que on peut y appliquer des fonctions (cf ci dessus) pour en securiser le contenu en fonction d'ou ils viennent (par exemple get et post permettent des injections externes). C'est ok la dessus ?

    Du coup, je ne sais touours pas s'il y a un risque a utiliser $GLOBALS["moElement"]->maMethode($maVariable)
    Spécialité : Développement WEB
    Indispensables : Doc PHP ~ Doc MySQL ~ w3schools ~ validateurs W3C ~ Google Adwords ~ PHP-Tester


  14. #14
    FoxLeRenard
    Invité(e)
    Par défaut
    Du coup, je ne sais touours pas s'il y a un risque a utiliser $GLOBALS["moElement"]->maMethode($maVariable)
    Eh que non il faut pas puisque $global sera bientôt périmé, donc autant faire autrement, genre variable de session qui est le top

  15. #15
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    Ok merci pour ces pistes
    Spécialité : Développement WEB
    Indispensables : Doc PHP ~ Doc MySQL ~ w3schools ~ validateurs W3C ~ Google Adwords ~ PHP-Tester


  16. #16
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 194
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 194
    Points : 8 409
    Points
    8 409
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par FoxLeRenard Voir le message
    Eh que non il faut pas puisque $global sera bientôt périmé, donc autant faire autrement, genre variable de session qui est le top
    Je n'ai pas trouvé d'infos à propos de la suppression de $GLOBALS sous PHP6. Peux-tu donner la page l'annonçant ?
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  17. #17
    FoxLeRenard
    Invité(e)
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Je n'ai pas trouvé d'infos à propos de la suppression de $GLOBALS sous PHP6. Peux-tu donner la page l'annonçant ?
    Bof l'Ami c'est encore vague je reconnais, mais le bon sens de la sécuritée devait amener a ne plus laisser ce paramétre dans PHP.INI

    Alors c'est pas encore exactement ta réponse mais en attendant,
    http://ie.php.net/manual/fr/security.globals.php

    Dis moi ton avis ça m'intéresse, car je sais ta compétence.

  18. #18
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 194
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 194
    Points : 8 409
    Points
    8 409
    Billets dans le blog
    17
    Par défaut
    Salut !
    Dans le lien fourni il est fait mention de register_globals. Effectivement celui-ci est voué à disparaître, et c'est pas trop tôt

    register_globals valorisait automatiquement des variables avec le contenu de l'URL & cie. Une vraie plaie pour les scripts mal écrits, notamment ceux n'initialisant pas leurs variables, exemple :

    http://www.exemple.net/index.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for ( $i = 0 ; $i < 4 ; $i++ ) {
        $buffer .= "i vaut $i<br>" ;
    }
    echo $buffer ;
    Donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    i vaut 0
    i vaut 1
    i vaut 2
    i vaut 3
    Avec register_globals à "On" on peut injecter du code en faisant :

    http://www.exemple.net/index.php?buffer=code+injecté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for ( $i = 0 ; $i < 4 ; $i++ ) {
        $buffer .= "i vaut $i<br>" ;
    }
    echo $buffer ;
    Donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    code injectéi vaut 0
    i vaut 1
    i vaut 2
    i vaut 3
    Il faudrait faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $buffer = '' ;
    for ( $i = 0 ; $i < 4 ; $i++ ) { ...
    Ce qui est d'ailleurs notifié avec un error_reporting(E_ALL)


    $GLOBALS étant la seule "méthode" propre de création de variables globales proposée par PHP pas de soucis à se faire à son propos, àmha.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  19. #19
    Membre éclairé
    Avatar de keaton7
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 743
    Points : 689
    Points
    689
    Par défaut
    Me voila rassure
    Spécialité : Développement WEB
    Indispensables : Doc PHP ~ Doc MySQL ~ w3schools ~ validateurs W3C ~ Google Adwords ~ PHP-Tester


  20. #20
    FoxLeRenard
    Invité(e)
    Par défaut
    Citation Envoyé par keaton2000 Voir le message
    Me voila rassure
    Et moi aussi , merci SEB !!

    Mais c'était le moment de bien aller au fond des choses sur le sujet ...
    on va pouvoir dormir tranquille du moins sur ce type d'attaques possibles

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Extraction de mots clés
    Par Olive1808 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 01/02/2016, 20h49
  2. [XML] extraction directe de données d'une BDD
    Par MicKCanE dans le forum XQUERY/SGBD
    Réponses: 7
    Dernier message: 04/09/2006, 13h01
  3. [tables systèmes] extraction de la structure d'une base
    Par laffreuxthomas dans le forum Autres SGBD
    Réponses: 6
    Dernier message: 23/03/2006, 13h24
  4. requête d'extraction de lieux (st et saint)
    Par sdchamplas dans le forum Langage SQL
    Réponses: 8
    Dernier message: 20/02/2003, 11h17
  5. Extraction des phrases d'un Texte
    Par LE CHAKAL dans le forum Langage
    Réponses: 6
    Dernier message: 19/08/2002, 21h23

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