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 :

[Sécurité] register_globals et session


Sujet :

Langage PHP

  1. #1
    Membre habitué Avatar de remyli
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 270
    Points : 151
    Points
    151
    Par défaut [Sécurité] register_globals et session
    [register_globals et session]

    register_globals http://fr.php.net/manual/fr/security.globals.php

    Salutations chers Développeurs.

    J’ai rencontré un bug assai bizarre sur un site.
    Mon code qui marchait très bien jusqu'à maintenant ne marche plus.

    Mon code avant :
    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
    //fichier ma_selection.php
     
    #Démarrage de la session
    session_start() ;
     
    # Récupération de la sélection
    $id_selection = false ;
     
    if(isset($_SESSION['id_selection'])) {$id_selection = $_SESSION['id_selection'];}
    if(isset($_GET['id_selection']))     {$id_selection = $_GET['id_selection'];}
    if(isset($_POST['id_selection']))    {$id_selection = $_POST['id_selection'];}
     
    if($id_selection === false)
    {
    	header ("location: mes_selections.php");
    }
    $_SESSION['id_selection'] = $id_selection ;
    Explication :

    Mon but est d’avoir un identifiant de sélection : $id_selection
    Je crée donc la variable $id_selection et je lui donne une valeur par défaut : false

    Ensuite je cherche une valeur pour ma variable.
    D’abord dans la session, puis dans les paramètres GET et enfin dans POST.

    Enfin je teste si ma variable est toujours égale (en type et en valeur ( = = = )) a false.
    Si c’est le cas c’est que je n’ai pas d’identifiant de sélection disponible et donc je quitte cette page.
    Sinon j’enregistre mon identifiant de sélection dans la session afin de pouvoir le récupérer au prochain appel à la page.


    Le premier appel à la page ce fait ainsi :
    ma_selection.php ?id_selection=666

    L’identifiant est bien récupéré dans GET et enregistré en session.
    Les autres appels n’ont plus besoin de préciser la sélection.


    Ce code marché correctement sur le serveur avec register_globals = On et marche toujours en local.



    Puis le problème suivant est apparut.

    La création de la variable $id_selection = false ; est effectué correctement. Mais il n’est plus possible de le récupérer dans la session.
    (La première affectation par GET marche Et $_SESSION['id_selection'] a bien sa valeur en début de script !!)
    Comme si $id_selection refusait de changer de valeur !!

    ___________
    J’ai dans un premier temps réglé le problème de la façon suivante

    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
    //fichier ma_selection.php
     
    #Démarrage de la session
    session_start() ;
     
    # Récupération de la sélection
    //$id_selection = false ;
     
    if(isset($_SESSION['id_selection'])) {$id_selection = $_SESSION['id_selection'];}
    if(isset($_GET['id_selection']))     {$id_selection = $_GET['id_selection'];}
    if(isset($_POST['id_selection']))    {$id_selection = $_POST['id_selection'];}
     
    //if($id_selection === false)
    if($id_selection == ‘’)
    {
    	header ("location: mes_selections.php");
    }
    $_SESSION['id_selection'] = $id_selection ;


    J’ai discuté du problème avec mon administrateur serveur et il m’a orienté vers le register_globals
    (Qui été à On sur le serveur et a Off chez moi, en local)

    Et il se trouve que mettre register_globals = Off règle le problème.


    Mais pourquoi ?
    Il ne me semble pas que ma méthode de programmation initial ne soit pas compatible avec register_globals = On , Au contraire ! J’ai essayé de développer de tel façon que mon code soit réutilisable quelque soit la configuration de cette variable et de façon a éliminé tout comportement aléatoire du à une variable auto définit.


    Si quelqu’un peut éclairer ma lanterne.

    Merci d’avance et bon code @Tous.

  2. #2
    Membre éclairé Avatar de J0r_x
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2006
    Messages : 804
    Points : 751
    Points
    751
    Par défaut
    si tu remplaces if($id_selection === false) par if(!$id_selection)

  3. #3
    Membre éclairé Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Points : 876
    Points
    876
    Par défaut
    Sinon plus simple...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    session_start();
    if (!isset($_SESSION['id_selection']) && !isset($_POST['id_selection']) && !isset($_GET['id_selection'])) {
    	header('location:  mes_selections.php');
    } else {
    	$_SESSION['id_selection'] = ($_POST['id_selection']) ? $_POST['id_selection'] : $_GET['id_selection']);
    }

  4. #4
    Membre habitué Avatar de remyli
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 270
    Points : 151
    Points
    151
    Par défaut Merci @|PaRa-BoL && @J0r_x
    @|PaRa-BoL
    La question n'est pas dans la 'simplicité' (traduite ici par de l'économie de charactaire)
    Mais dans le pb ça a marché, et pourquoi ça n'as plus marché.

    Et pi je sais pas ... pour moi, (et peut être que moi) je trouve ma syntaxe plus lisible.




    @J0r_x
    if(!$id_selection)
    Ne permet pas la comparaison de type.
    Mon identifiant de selection pourait étre 0
    Mais en pratique, je suis d'accord : ce ne sera jamais le cas!

  5. #5
    Membre éclairé Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Points : 876
    Points
    876
    Par défaut
    Lisible pour toi peut etre mais c'est pas très propre.

    Sinon tu peux toujours essayer de debuguer avec des echo pour voir si les conditions sont bien remplis et peut être essayer avec empty() au lieu de isset().

    Et aussi reparer les erreures de logiques...

    Et aussi pourquoi initialise tu ta variable à false et ne verifis tu pas directement avec !isset() au lieu de verifier son intégrité initiale ?

  6. #6
    Membre habitué Avatar de remyli
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 270
    Points : 151
    Points
    151
    Par défaut Merci @ |PaRa-BoL
    Citation Envoyé par |PaRa-BoL
    Lisible pour toi peut être mais c'est pas très propre.
    Question d'habitude. Enfin là n'est pas le problème.
    Et pis le problème est résolut grace au changement de register_global

    Citation Envoyé par |PaRa-BoL
    Sinon tu peux toujours essayer de débuguer avec des echo pour voir si les conditions sont bien remplis et peut être essayer avec empty() au lieu de isset().
    C'est grâce au écho que j'ai pu diagnostiquer un refus de changement de valeur (je vais mettre le code avec les echo)

    Citation Envoyé par |PaRa-BoL
    Et aussi réparer les erreurs de logiques...
    S'il y en a je veux bien qu'on me les indique.... car, peut être, ma propre logique m'échappe.

    Citation Envoyé par |PaRa-BoL
    Et aussi pourquoi initialise tu ta variable à false et ne vérifies tu pas directement avec !isset() au lieu de vérifier son intégrité initiale ?
    A l'origine je suis développeur C++ puis java.
    J'ai donc hérité de certaines habitude qui même si elle ne sont pas indispensables en php ne sont 'normalement' pas nuisible (et plutôt bonnes selon moi).


    ------------------------
    Mais c'est vrai que ce problème remet en cause toute ma vision de la chose

  7. #7
    Membre habitué Avatar de remyli
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 270
    Points : 151
    Points
    151
    Par défaut le code avec les echo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    echo "<br>_SESSION['id_selection'] = " . $_SESSION['id_selection']; //666
     
    //selection 
    $id_selection = false;
    echo "<br>id_selection = " . $id_selection; // rien : c'est false
    if(isset($_SESSION['id_selection'])) {$id_selection = $_SESSION['id_selection'];}
    if(isset($_GET['id_selection']))     {$id_selection = $_GET['id_selection'];}
    if(isset($_POST['id_selection']))    {$id_selection = $_POST['id_selection'];}
    echo "<br>id_selection = " . $id_selection; // rien : c'est false
    if($id_selection === false)
    {
    	header ("location: mes_selections.php");
    	echo '<br>header ("location: mes_selections.php")<br>';
    }

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par SoF_AzraeL
    Question d'habitude. Enfin là n'est pas le problème.
    Et pis le problème est résolut grace au changement de register_global


    C'est grâce au écho que j'ai pu diagnostiquer un refus de changement de valeur (je vais mettre le code avec les echo)


    S'il y en a je veux bien qu'on me les indique.... car, peut être, ma propre logique m'échappe.


    A l'origine je suis développeur C++ puis java.
    J'ai donc hérité de certaines habitude qui même si elle ne sont pas indispensables en php ne sont 'normalement' pas nuisible (et plutôt bonnes selon moi).


    ------------------------
    Mais c'est vrai que ce problème remet en cause toute ma vision de la chose
    Le seul truc que ceci peut t'apprendre c'est de faire en sorte de travailler avec un register_globals à OFF !

    C'est hautement recommandé niveau sécurité et la plupart des hébergeurs se doivent de le mettre à OFF. En effet, si tu travailles de cette façon, tu peux contrôler tout ce qui rentre et sort de tes pages web.

    Et même s'il est à ON cela fonctionnera à l'inverse de ta programmation qui compte sur le register globals ON!!

    Juste un conseil que je te donne



  9. #9
    Membre habitué Avatar de remyli
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 270
    Points : 151
    Points
    151
    Par défaut
    Citation Envoyé par bblampain
    l'inverse de ta programmation qui compte sur le register globals ON!!
    Grrrrrrr
    Mais je veux travailler avec register globals OFF !!!
    Donc j'ai tout fait pour que ça marche avec register globals ON ou OFF !!
    Et ce même si le serveur était sur ON ...
    Et ça marchait bien !!!!!

    Et pi un jour (comme ça sens rien ....) ça marche pu !!!!

    POURQUOI !!!!!!

  10. #10
    Membre éclairé Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Points : 876
    Points
    876
    Par défaut
    Mais on te la déjà dit !!!!!

    Va lire la doc PHP sur register_global et tu comprendras mieux... c'est quand meme pas compliqué, je t'ai même filé le code qui marche...

  11. #11
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut, ton code avec les echo c'est avec les global à on ou off ?
    parce que ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    echo "<br>_SESSION['id_selection'] = " . $_SESSION['id_selection']; //666
     
    //selection 
    $id_selection = false; // ici tu écrases SESSION['id_selection']
    echo "<br>id_selection = " . $id_selection; // rien : c'est false
    Avec les global à on ca me paraît normal, mais off :/

  12. #12
    Membre habitué Avatar de remyli
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 270
    Points : 151
    Points
    151
    Par défaut
    ça veut dire que le fait de lire $_SESSION['id_selection'] créer un pointeur $id_selection vers $_SESSION['id_selection']
    et que en faisant $id_selection = false; j'écrase $_SESSION['id_selection'] ?????





    Je crois que j'ai plus qu'a tout oublier du php et tout réaprendre......

  13. #13
    Membre habitué Avatar de remyli
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 270
    Points : 151
    Points
    151
    Par défaut
    http://fr.php.net/manual/fr/security.globals.php
    Citation Envoyé par php.net
    Lorsque register_globals est activé, la logique ci-dessus peut être prise en défaut. Lorsque register_globals est désactivée $authorized ne peut plus être assignée via la requête, et le script est maintenant sûr, même s'il reste recommandé de toujours initialiser ses variables. Par exemple, dans notre programme ci-dessus, nous pourrions ajouter $authorized = false. En faisant cela, le script peut fonctionner avec register_globals on ou off, car les utilisateurs seront par défaut non-identifiés.
    c'est bien ce que je fait :

    j'initialise ma variable
    ensuite je lui affecte une valeur en massurant de ça provenance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(isset($_SESSION['id_selection'])) 
    {$id_selection = $_SESSION['id_selection'];}
    Si $id_selection est toujour == false c'est que je n'ais pas d'id_selection.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 82
    Points : 87
    Points
    87
    Par défaut
    Peut être vais-je dire une grosse connerie, mais j'avais le même gende de problème que j'ai résolu en faisant un

    voila mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    session_start();
    if(isset($_POST) && !empty($_POST['login']) && !empty($_POST['pass'])) {
      extract($_POST);
      $var1=$login
      $var2=$pass
    }
    mais faut pas me demander pourquoi depuis que j'ai fait ça j'ai plus de problèmes.

    @++

  15. #15
    Membre habitué Avatar de remyli
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 270
    Points : 151
    Points
    151
    Par défaut
    En effet c'est bizzard

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 82
    Points : 87
    Points
    87
    Par défaut
    as tu essayé de faire un extract() sur tes variables globales de type POST et GET ?

    ça donne quoi ?

    @++

  17. #17
    Membre éclairé Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Points : 876
    Points
    876
    Par défaut
    Citation Envoyé par p.legal
    as tu essayé de faire un extract() sur tes variables globales de type POST et GET ?

    ça donne quoi ?

    @++
    Faut arrêter de donner de mauvaise habitudes ><

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 82
    Points : 87
    Points
    87
    Par défaut
    Désolé, je voulais juste faire avancer le smilblick
    à l'avenir, je m'abstiendrais ....

    mais, autant que je me couche moins c.. ce soir, en quoi utiliser extract() est une mauvaise habitude ?

    @++

  19. #19
    Membre éclairé Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Points : 876
    Points
    876
    Par défaut
    un $_POST est un $_POST et une variable normal est une variable normal, sinon autant mettre le register_global à on

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 82
    Points : 87
    Points
    87
    Par défaut
    Merci pour ta réponse :
    est ce que tu essaye de me dire qu'il faut laisser la variable $_POST['lot'] telle qu'elle ?
    et donc ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(isset($_POST) && !empty($_POST['lot'])) {
      	extract($_POST);
        $tmp = $lot;
        $lot=htmlspecialchars($tmp, ENT_QUOTES);
    	}
    devrait plutôt ressembler à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(isset($_POST) && !empty($_POST['lot'])) {
        $_POST['lot']=htmlspecialchars($_POST['lot'], ENT_QUOTES);
    	}
    Oui ???

Discussions similaires

  1. [Sécurité] Crypte les sessions
    Par amazircool dans le forum Langage
    Réponses: 4
    Dernier message: 07/09/2006, 15h58
  2. [Sécurité] Problème de sessions avec IE6
    Par TheMoutch dans le forum Langage
    Réponses: 8
    Dernier message: 21/08/2006, 17h52
  3. [Sécurité] fermeture de session
    Par cyrill.gremaud dans le forum Langage
    Réponses: 16
    Dernier message: 26/06/2006, 09h58
  4. [Sécurité] Problème de session
    Par Sandara dans le forum Langage
    Réponses: 31
    Dernier message: 23/05/2006, 16h10
  5. [Sécurité] Créer une session sécurisée
    Par HwRZxLc4 dans le forum Langage
    Réponses: 6
    Dernier message: 16/05/2006, 22h19

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