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 :

Changement aléatoire d'une variable de session [PHP 5.2]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 12
    Points : 8
    Points
    8
    Par défaut Changement aléatoire d'une variable de session
    Bonjour,

    un bug sur lequel je bute depuis plusieurs jours :

    Je suis sur une release2 d'OVH en Gentoo.

    je fais une première page de formulaire avec <? session_start(); ?>
    Dans ce formulaire, je crée un token :

    $token = md5(uniqid(rand(), true));

    j'enregistre le token comme variable de session : $_SESSION['token']=$token;

    Pour débugger , je le fais écrire cette variable :
    echo "token = $_SESSION['token']" <br>;
    ainsi que l'identifiant de session.

    Mon formulaire envoie (en get) le token qui est comparé à la variable de session pour activer la page 2. Ca ne fonctionne pas.

    Je reste sur la page 1, je rafraîchis, je note le session _ID et par ftp je le télécharge et l'ouvre : la variable de session token est différente et correspond à celle qui sera lue dans la page 2 ?????

    Alors que la page 1 relis bien la variable stockée, celle qui apparaît dans le fichier de session est différente. Si je remplace le token par une chaîne de caractères 'mavariable', alors là, tout est OK, la variable de session affichée dans la page1, celle affichée dans la page2 et celle contenue dans le fichier session_id est bien 'mavariable'.

    Quelqu'un a t'il une idée ? J'ai une vingtaine de sites, ce problème ce déclare aléatoirement sur 2 sites.

    le code de la page 1:
    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
     
    <?PHP
    ini_set('session.save_path','/home/xxxxxxxx/www/sessions');
    session_start();
    ?>
    $token = md5(uniqid());
    $_SESSION['token'] = $token;
    echo "tok=".$token." et session = ".$_SESSION['token']." <br>";
    $nom = session_name();
    $id = session_id();
    echo "nom session: $nom<br>";
    echo "id session: $id<br>";
     
    //le lien pour agrandir l'image :
     
    <a href="javascript:JOpenWn('window_rdp.php?img_name= <?echo $image;?>&img_w=<?echo $width;?>&img_h=<?echo $height;?>&tok=<?echo $token;?>','photo','scrollbars=yes,resizable=yes,w idth=<?echo $width2;?>,height=<?echo $height2;?>')">
    <img src="<?echo $image_m;?>" width="75" alt="clic pour agrandir"></a>
    le code de la page 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php
    ini_set('session.save_path','../sessions');
    session_start();
     
    $tok=$_GET['tok'] ;
    $session=$_SESSION['token'];
     
    //echo "tok=".$tok." et session = ".$_SESSION['token']." <br>";
    if (isset($_SESSION['token'])&& $tok == $_SESSION['token']){
    ...}
    Ces codes sont à l'identique de ceux qui fonctionnent sur d'autres sites hébergés sur le même serveur et configurés de la même manière.

    La question est de comprendre pourquoi quand je fais en page 1

    $_SESSION['token'] = $token;
    echo " session = ".$_SESSION['token']." <br>";

    je ne retrouve pas cette variable sauvegardée dans le fichier de session alors que le echo est OK ???


    Merci pour votre aide.

  2. #2
    Membre éprouvé Avatar de alain31tl
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 935
    Points : 1 019
    Points
    1 019
    Par défaut
    Citation Envoyé par Ginux Voir le message
    .... Si je remplace le token par une chaîne de caractères 'mavariable', alors là, tout est OK, la variable de session affichée dans la page1, celle affichée dans la page2 et celle contenue dans le fichier session_id est bien 'mavariable'.....
    Bonjour

    La conclusion est certainement dans ton observation ci-dessus.

    Que peut-on en déduire ?
    Déjà, que ta session est conforme et parfaitement créée, et on accéde bien à la variable fixe.

    Mais voilà, pourquoi celà ne fonctionne pas dans le premier cas.
    Simplement parce qu'il y a écrasement de ta variable de session md5, et elle est recréée à chaque fois que tu relances cette même page.
    Si tu lances un F5 d'actualisation, tu écrases obligatoirement ta variable par une autre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    session_start();
    $token = md5(uniqid(rand(), true)); // variable aléatoire
    $token_2 ="1738475529"; // variable fixe
    print("<br>");
    print("$token");
    print("<br>");
    print("$token_2");
    ?>

  3. #3
    Membre éprouvé Avatar de alain31tl
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 935
    Points : 1 019
    Points
    1 019
    Par défaut
    Complément :

    Puisque tu travailles avec une variable générée aléatoirement, tu devrais créer une condition pour éviter l'écrasement de la var enregistrée.

    Sobre exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?php
    session_start();
     
    if ((isset($_SESSION['token'])) 
    { 
    //on fait rien...ou ce que tu veux
    }
    else
    {
    $token = md5(uniqid());
    $_SESSION['token'] = $token;
     
    }

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par alain31tl Voir le message
    Bonjour

    La conclusion est certainement dans ton observation ci-dessus.

    Que peut-on en déduire ?
    Déjà, que ta session est conforme et parfaitement créée, et on accéde bien à la variable fixe.

    Mais voilà, pourquoi celà ne fonctionne pas dans le premier cas.
    Simplement parce qu'il y a écrasement de ta variable de session md5, et elle est recréée à chaque fois que tu relances cette même page.
    Si tu lances un F5 d'actualisation, tu écrases obligatoirement ta variable par une autre.
    Merci Alain31tl pour cette première réponse. Je suis d'accord avec ta première conclusion...quoique...

    Je ne rafraîchis pas la page, ou plutôt je ne la rafraîchis pas à nouveau...

    Je charge ma page, je fais afficher la variable de session et le session ID, et sans rafraîchir je vais chercher par FTP le fichier de session correspondant, c'est là que je constate que la variable est différente.
    J'insiste sur le fait que c'est aléatoire, aujourd'hui, ça fonctionne...et que je rencontre ce souci sur 2 sites sur une vingtaine installé et paramètré à l'identique.

    Ca a l'air plus sioux qu'un écrasement de variable...

  5. #5
    Membre éprouvé Avatar de alain31tl
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 935
    Points : 1 019
    Points
    1 019
    Par défaut
    Pourquoi tu n'essayes pas ma suggestion précédente, soit celle de verifier si la session token est existante, avant quoique ce soit.
    Ca mange pas de pain, et celà fait avancer les choses.

    [Edit]

    Et pour faire plus court :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ((!isset($_SESSION['token'])) 
    { 
    $token = md5(uniqid());
    $_SESSION['token'] = $token;
    }

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 12
    Points : 8
    Points
    8
    Par défaut variable de sessions bizares
    Oui je vais essayer, comme c'est aléatoire, e, effet cela pourrait venir d'une réinitialisation des variables, même si je ne vois pas d'où...
    Le problème est que pour l'instant, ça fonctionne, donc je ne peux pas faire l'essai. Dès que ça replante, je tente.
    Merci pour ton aide.

  7. #7
    Membre éprouvé Avatar de alain31tl
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 935
    Points : 1 019
    Points
    1 019
    Par défaut
    Revenons un peu en arrière :
    1 -Utilise une variable fixe.
    Lances un F5 d'actualisation.( Ben oui, rien de tel pour tester)
    Elle est bien présente, et tjrs identique ?.
    Et encore, et encore, et encore.
    Simplement parce qu'elle est mise en session et qu'elle y restera, tant que la valeur de cette variable de session ne sera pas modifiée intentionnellement.
    Dans ce cas de figure, tu maîtrises ta/tes variables.

    2- Tu crées une session avec une syntaxe php (md5) qui fournit de l'aléatoire.
    Autrement dit, ce n'est pas toi qui décide ou maîtrise la valeur de cette variable.
    Comment veux-tu que ta session initilialement enregistrée demeure, si tu ne prends pas la précaution de vérifier si elle est bien isset ?

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 12
    Points : 8
    Points
    8
    Par défaut il y a un truc qui m'échappe...
    il doit me manquer un morceau du puzzle car...grâce à ta suggestion, ça fonctionne mais je ne comprends pas pourquoi.

    D'abord les réponses aux essais que tu me suggères :

    1 -Utilise une variable fixe : oui ça marche tout le temps même après pleins de F5
    2- variable aléatoire : ça déconne sauf si je fais un isset comme tu le suggères.

    Je dois donc faire une erreur dans mon raisonnement. Voilà ce que je pensais faire :

    page 1 qui affiche des miniatures :

    un session_start() ; pour commencer
    ensuite je crée ma variable
    $token = md5(uniqid(rand(), true));
    je range ma variable dans la session :
    $_SESSION['token'] = $token;
    ma variable $token est créée, je l'ai rangée dans la session donc à ce moment là je dois avoir la variable $token et la variable $_SESSION['token'] identiques.


    si par FTP je vais chercher le fichier de session (identifié par session_id) et que je l'ouvre, je vois une autre variable comme valeur de token.

    C'est donc normal que lorsque dans la page 1, j'envoie $token en get, et que dans la page 2 je le compare à $_SESSION['token'] , je trouve une différence. Par contre le $_SESSION['token'] lu dans la page 2 est bien celui que je lis dans le fichier de session.

    Pour moi, à chaque fois que je fais F5, je re initialise une nouvelle variable, je range la nouvelle variable dans ma session et ça doit marcher.

    Dans ce que tu suggères par le isset, cela évite à chaque rechargement de page de créer une nouvelle variable...mais où est le problème ?

    Suivant tes conseils , j'ai fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if (!isset($_SESSION['token']))
    { 
    $token = md5(uniqid(rand(), true));
    $_SESSION['token'] = $token;
    }else
    {$token=$_SESSION['token'];
    echo "token=".$_SESSION['token']."";}
    si la variable de session existe déjà, je donne à la valeur que je vais envoyer en GET la valeur de cette variable de session et là c'est OK.

    Toujours convaincu qu'il y a une disparité entre ces 2 variables, j'ai à nouveau enlevé le isset et j'ai fait ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $token = md5(uniqid(rand(), true));
    $_SESSION['token'] = $token;
    $token=$_SESSION['token'];
    Je redonne à ma variable $token la valeur lue dans la session. Ca plante !

    J'y comprends rien. Où fais-je erreur dans mon raisonnement ?

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 12
    Points : 8
    Points
    8
    Par défaut oubli
    j'avais oublié :

    merci pour ton aide. Entre toulousains, je te paierai bien un verre à l'occasion.

  10. #10
    Membre éprouvé Avatar de alain31tl
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 935
    Points : 1 019
    Points
    1 019
    Par défaut
    La gestion des sessions est relativement simple, mais il est plus prudent de protéger les variables qui doivent demeurer à terme, comme l'identifiant d'un utilisateur, par exemple.
    Je précise " celles à terme", car rien ne t'empêche dans le déroulement des scripts d'en écraser d'autres pour les actualiser.
    Je prend pour modéle, un site commercial (qtés, prix, etc..) qui peuvent être modifiés au fil de la visite.
    Mais ceci ne doit surtout pas impacter les variables d'identifications, et par conséquent de les isoler totalement.
    La solution, celle suggérée.
    On ne touche plus à certaines variables importantes tant que la session n'est pas "détruite".

    Pour le reste, ton raisonnement suit le mien.

    La zone d'ombre, c'est bien cet aspect de création de variable aléatoire qui pose probléme si on ne la protége pas.
    Ou plutôt comment réagit le serveur dans ce cas de figure.
    J'ai comme le sentiment que ton md5(uniqid()); est relancé quand tu accédes à ton fichier via ftp.

    A ce propos, et pour ma gouverne, je note que tu peux ouvrir ce fichier.

    Sachant que ces infos sont sauvegardées sur un serveur distant et "protégé", de quel fichier de session s'agit-t'il ?
    C'est toi qui l'a créé ?... free ?

    Sur plusieurs de mes sites, je n'ai accés à aucuns de ces fichiers, si tant est qu'ils soient disponibles.

    ps : Une leffe siouplait

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 12
    Points : 8
    Points
    8
    Par défaut remerciements
    Ok pour l'explication, j'en prends bonne note même si je ne suis pas certain d'avoir parfaitement compris. Une zone d'ombre demeure :

    A quel moment je rafraîchis ma variable de sessions ? J'ai même fait des essais ou je la relis et l'affiche tout en bas de la page, pensant qu'une autre action dans la page les rafraîchissait. Non, elle demeure identique.

    Je vais me contenter du principe que tu suggères et que je vais instituer "de base"."Protéger les variables d'identification".

    Quant aux fichiers de sessions. J'héberge mes sites chez OVH, par défaut, les fichiers sessions sont créés dans un répertoire de la partition système. Comme tu peux le voir avant le session_start(), j'ai redéfini l'emplacement des sessions et les dépose dans un dossier "sessions" créé sous la racine de chaque site comme chez Free.
    Ensuite, avec mon client FTP favori, je vais chercher ce fichier et le lis avec un éditeur de texte...tout simplement... Et je ne pense pas que ce soit là que je réactualise mes variables...

    Pour la Leffe, ce sera avec plaisir, donne moi sur ma MP ton heure et lieu de prédilection...@+ et merci encore.

  12. #12
    Membre éprouvé Avatar de alain31tl
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 935
    Points : 1 019
    Points
    1 019
    Par défaut
    Ok, si tu n'es pas chez Free, mais OVH, tu peux supprimer ta ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ini_set('session.save_path','/home/xxxxxxxx/www/sessions');
    Et même le répertoire.

    Il n'est d'aucune utilité, ou conseillé pour une utilisation chez ce dernier hébergeur.
    Il est même possible qu'il soit la source du conflit.
    Pour tester tes variables, il est préférable et plus logique de le faire directement depuis ton navigateur, soit en ligne et non pas FTP, puisque les variables sont accessibles navigateur open.
    Dans ce cas et si c'est important pour toi, une simple page test.php avec tes différents echos devraient faire l'affaire, et à la racine de ton www.
    Mais encore une fois, si c'est vraiment utile. (?)

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    la première ligne m'est utile. J'héberge plusieurs sites, une trentaine environ tous réalisés avec un CMS de ma conception. Par défaut chez OVH, le PHP.ini dépose les sessions sur la partition système. Suite à ce bug, à un moment, j'ai supposé qu'il pouvait y avoir un conflit de session, c'est pour cela que j'ai décidé de classer les sessions à la racine de chaque site. Ok , ça n'a rien changé mais ça ne peut pas expliquer ce bug qui existait auparavant.

    Quant à faire des échos, c'est bien ça mon souci, la valeur de l'echo dans la page1 n'est pas identique à la valeur stockée dans la session qui par contre est égal à la valeur de l'echo de la page 2.

    echo $_session['token'] dans la page 1 = variable 1
    variable 'token' lue dans le fichier de session = variable 2
    echo $_session['token'] dans la page 2 = variable 2

    Je vais tester avec le isset sur plusieurs jours, pour l'instant ça fonctionne.
    Merci.

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Ginux Voir le message

    Je vais tester avec le isset sur plusieurs jours, pour l'instant ça fonctionne.
    Merci.
    Voilà quelques jours que ça fonctionne. je garde cette solution même si elle ne me satisfait pas complètement car la cause racine est toujours mystérieuse.

    Merci à Toi Alain31tl

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 15/05/2010, 14h37
  2. Réponses: 6
    Dernier message: 15/11/2007, 14h52
  3. [C#] ArrayList dans une variable de session ?
    Par Oberown dans le forum ASP.NET
    Réponses: 1
    Dernier message: 12/12/2005, 16h50
  4. [C#] Tester existence d'une variable de session
    Par IDNoires dans le forum ASP.NET
    Réponses: 2
    Dernier message: 31/12/2004, 13h30
  5. Création d'une variable de session avec un ID
    Par PrinceMaster77 dans le forum ASP
    Réponses: 4
    Dernier message: 18/10/2004, 11h28

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