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 :

urldecode sur $_GET


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 122
    Par défaut urldecode sur $_GET
    Bonjour,

    Juste pour confirmer :

    Si je fais urlencode($toto) sur une variable $toto passée avec la méthode GET dans un formulaire, il faut selon moi que je fasse à l'arrivée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    extract($_GET) ;
    $vrai_toto = urldecode($toto) ;
    ...
    En effet j'ai vérifié et ça marche.

    Mon souci c'est que j'ai vu écrit dans le manuel php : http://fr2.php.net/manual/fr/function.urldecode.php je cite :

    "Les superglobales $_GET et $_REQUEST sont déjà décodées. Utiliser urldecode() sur un élément de $_GET ou $_REQUEST peut avoir des conséquences inattendues et dangereuses. "

    Comme je suppose qu'ils ont raison, j'imagine que ce qu'ils disent est vrai si on utilise register_globals = ON mais pas si register_globals = OFF

    Est-ce qu'un expert peut confirmer que mon interprétation est la bonne ?

    Merci.

  2. #2
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    Comme la doc l'indique, les données reçues en get, post disponibles dans les tabeaux $_GET, $_POST sont déjà décodés, donc appliquer un urldecode() sur ces données c'est le faire 2 fois, c'est déjà inutile.

    Pour le coté sécurité, et bien si tu applique une 2ème fois un urldecode(), tu prends le risque de modifier certains caractères d'une donnée, et donc ne pas obtenir la valeur attendue.
    Déjà là, c'est source de bug, mais pire, c'est peut être ce qu'attendait le pirate, et que plus loin dans ton code en exploitant cette donnée que ça débouche sur un acte de piratage.

    De l'autre, concernant la directive register_global à ON, ceci est aussi un manque de sécurité, car toutes les données obtenue en GET, POST seront automatiquement converties en variables.
    Donc un paramètre envoyé en GET, comme index.php?toto=trucmuche, on obtiendra une variable $toto contenant trucmuche.
    Exploiter directement cette variable sans vérification au préalable est un manque de sécurité, et c'est malheureusement une pratique courante.

    Du coup, la communauté a décidé un jour de mettre cette directive par défaut à Off.
    Celle ci n'existera plus dans la version Php6 d'après ce qui est annoncée.


    Cependant, les hébergeurs ont évolués (donc RG Off par défaut), parmi ceux là certains n'offraient pas la possibilité de modifier le register_global, donc toujours à Off.
    Et bien le piège, c'est que certains projets tournant sur ces hébergeurs ont utilisés comme astuce d'utiliser cette fonction extract(), et l'appliquer sur GET et POST.
    Les projets pouvaient continuer de tourner grâce à ça, donc sans trop d'effort.
    Mais bien que le register_global soit à Off, ce n'est pas pour autant que ces projets là soient plus sécurisés, bien au contraire.


    Conclusion, tu exploite cette fonction extract(), et bien c'est déjà un manque de sécurité, ceci revient à simuler le register_global à On.
    Je te conseil d'exploiter le donnée telle quelles sont reçues, soit $_GET['toto'] ou $_POST['toto'] mais aussi, et surtout vérifier que le contenu soit conforme à celui attendu.
    Puis ne pas appliquer de urldecode().

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 122
    Par défaut
    Merci RunCodePhp pour ta réponse étayée.

    - OK pour ta remarque qu'il vaut mieux ne pas utiliser extract.

    - Par contre je ne comprends toujours pas pourquoi il ne faut pas faire de urldecode (comme le dit effectivement le site référencé) car dans mon code SI JE NE FAIS PAS urldecode CA NE MARCHE PAS! il me faut faire urldecode !!

    Je fais donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    extract($_GET) ;
    echo $toto."<br>" ;
    $toto = urldecode($toto) ;
    echo $toto ;
    Sans quoi si $toto= "la lune" je reçois à l'écran :

    la+lune
    la lune

    Merci,

    JP

  4. #4
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Et si tu fais :
    tu obtiens quoi ?


    Ceci dit, tu continu d'exploiter extract().

    La doc dit ceci :
    Avertissement
    N'utilisez pas extract() sur des données inconnues, comme les données utilisateurs (i.e. $_GET, $_FILES, etc.).
    Si vous le faites, par exemple, pour rendre compatible un vieux code avec register_globals à Off de façon temporaire, assurez-vous d'utiliser l'une des constantes extract_type qui n'écrasent pas les valeurs, comme EXTR_SKIP. Sachez aussi que vous devez maintenant extraire dans le même ordre que celui défini dans variables_order du php.ini.
    Donc à par rendre compatible un vieux code, et temporairement, comme dit ci-dessus, je ne vois pas l'intérêt de le faire dans ton cas.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 122
    Par défaut
    idem ! si je n'utilise pas urldecode :
    echo $_GET['toto'] ;
    donne "la+lune"

    IL FAUT DONC FAIRE urldecode contrairement à ce que dit la doc ??!!

  6. #6
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    IL FAUT DONC FAIRE urldecode contrairement à ce que dit la doc ??!!
    Pas besoin de crier aussi fort ... on est pas sourd ...

    Il doit avoir une explication, il serait pas mal de le savoir, mais ça se justifie peut être, je ne dis pas.
    Pour le urldecode() en tout cas, pas pour le extract().

    De mémoire tout de même, j'ai jamais eu ce problème là, jamais rencontré ce phénomène, donc jamais eu l'occasion d'utiliser cette fonction urldecode().
    J'en conclu que tu dois te trouver dans un cadre particulier, mais je ne vois pas lequel.
    En tout cas la conversion/décodage ne se fait pas, or, ça le devrait.
    Mon réflexe serait de me tourner du coté du php.ini, mais je ne vois pas quelle directive serait concernée.
    Sinon, c'est peut être du coté de Apache.

    Faut peut être dire dans quel environnement tu te trouve.
    Local, distant ?
    versions : Apache, Php, le navigateur aussi.

    Puis de quelle manière transmet tu cette donnée (lien, formulaire), le contenu est il fait en Php ou en dur ?
    Mets y le code, c'est plus simple.

    Y a t'il des routines de codes qui peuvent être déclenchés avant d'exploiter le $_GET ?

    Bref, faut en dire plus pour espérer une explication.

  7. #7
    Membre Expert Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Par défaut
    le problème est peut-être au début
    Citation Envoyé par jpguiche Voir le message
    si je fais urlencode($toto) sur une variable $toto passée avec la méthode GET dans un formulaire
    montre nous le code que tu utilises pour construire l'URL

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 122
    Par défaut
    Le voici :

    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
     
     
    // Coté appelant :
    ...
    $theme = urlencode($theme) ;
    $region = urlencode($region) ;
    header("Location: D_sinscrire_a_session.php?theme=$theme&region=$region&id_opportunite=$id_opportunite") ;
    exit() ;
     
    // Coté  D_sinscrire_a_session.php :
     
    $theme = $_GET['theme'] ;
    $region = $_GET['region'] ;
    $id_opportunite = $_GET['id_opportunite'] ;
    //
    $theme = urldecode($theme) ; 
    $region = urldecode($region) ;
    Je n'ai pas besoin de faire urlencode sur la variable $id_opportunite car c'est un nombre, par contre je le fais sur $theme et $region car ce sont des chaînes avec des espaces...

    Une idée ?

  9. #9
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Fais un essai avec la fonction : rawurlencode(), c'est c'est peut être un problème de norme.
    Donc juste pour encoder la chaine, et théoriquement, il ne devrait pas être utile de décoder.

    Sinon, il y a la fonction http_build_query() qui contruit une URL à partir d'un tableau.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 122
    Par défaut
    J'ai fait l'essai avec rawurlencode... c'est pareil il faut quand meme décoder ...

  11. #11
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    j'ai fait l'essai avec rawurlencode... c'est pareil il faut quand meme décoder ...
    ben alors là ???

    As tu essayé d'encoder toutes l'URL ?
    Comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $url = rawurlencode('theme='.$theme.'&region='.$region.'&id_opportunite='.$id_opportunite);
    header('Location: D_sinscrire_a_session.php?'.$url);
    exit();
    Et sans encoder ? Ca donne quoi ?

    Même si ça à l'air cuit d'avance, si tu mets "en dur" l'encodage, cet exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    header('Location: D_sinscrire_a_session.php?toto=-%26-');
    Théoriquement, un echo $_GET['toto'] renvoie : -&-
    Si tu est toujours obligé de décoder, alors c'est qu'il y a vraiment quelque chose ailleurs, Php ou Apache.
    Mais je ne vois vraiment pas où.

Discussions similaires

  1. urldecode automatique sur $_GET ?
    Par jpguiche dans le forum Langage
    Réponses: 4
    Dernier message: 03/05/2010, 16h29
  2. [RegEx] Appliquer un urldecode sur toute les url d'une page
    Par Bruno.C dans le forum Langage
    Réponses: 8
    Dernier message: 10/12/2008, 17h24
  3. [Tableaux] $_GET urldecodé automatiquement ?
    Par zk dans le forum Langage
    Réponses: 3
    Dernier message: 14/06/2007, 11h44
  4. [SQL] Aide sur $_GET
    Par ZeRiL dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 09/05/2006, 11h25
  5. Message notic sur _Get
    Par Sylvain245 dans le forum Langage
    Réponses: 2
    Dernier message: 05/12/2005, 12h54

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