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 :

[Cookies] Session en double


Sujet :

Langage PHP

  1. #1
    Membre éclairé Avatar de nicoaix
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 571
    Par défaut [Cookies] Session en double
    Bonjour,
    J'ai un petit problème avec mes sessions...
    Mon site fonctionne avec une page d'index permettant une identification par login et password. Une fois l'utilisateur authentifié une session est créée.

    Tout fonctionne correctement dans 95% des cas...Mais il arrive parfois que 2 fichiers de session concernant le même utilisateur existe. Ce qui fait que quelque soit le lien sur lequel il clic, il est rejeté.

    Voici le bout de code que j'utilise sur ma page d'index concernant les sessions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    session_start();
    $_SESSION = array();
    if (isset($_COOKIE[session_name()])) {
        setcookie(session_name(), '', time()-42000, '/');
    }
    session_destroy();
    C'est un bout de code que j'ai récupéré. Je ne suis pas sûr de son efficacité.
    Mon problème vient peut-être de là...
    Que me conseilleriez-vous pour éviter toute duplication de fichier de session?

    Merci.

  2. #2
    Membre émérite
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Par défaut
    Rien a voir avec ta question, mais ça :

    setcookie(session_name(), '', time()-42000, '/');
    T'es sur que ça a vraiment un sens ? parce que si je ne m'abuse dans ma traduction, ça veut dire "le cookie expire dans (date du jour - 1 er janvier 1970 - 4200) secondes" ou encore "le cookie expire dans un délais correpondant au temps écoulé depuis le 1/1/1970 - 4200 secondes"... Et je doute que ça soit ce que tu ai voulu faire !

    Ensuite, je ne vois pas le rapport entre le fait qu'un utilisateur ai 2 sessions ouvertes et le fait qu'il ne puisse plus cliquer nul part... Peux tu être plus précis ?

  3. #3
    Membre éclairé Avatar de nicoaix
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 571
    Par défaut
    Lorsqu'il y a 2 sessions pour l'utilisateur Toto par exemple:
    Lorsque l'utilisateur clic sur un lien vers la page liste.php. Cette page (comme toute les autres) vérifie l'existence de la session avec le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    session_start();
    // Vérification de l'autorisation
        if (!$_SESSION["membre"]) {
           // Si l'utilisateur n'est pas autorisé il est reconduit
           // sur le formulaire d'identification
           header("Location: index.php");
           die();
        }
    La variable $_SESSION["membre"] est mise à 'true' lors de la création de la session.
    Donc s'il y a 2 sessions l'autentification echoue. Je ne sais pas pour quelle raison. Et donc l'utilisateur est renvoyé à la page d'index.

    En ce qui concerne le code de la page d'index, j'avoue avoir récupérer ce code sans chercher en détails son fonctionnement. Ma préoccupation étant de tuer la session d'un utilisateur qui serait déjà connecté afin d'éviter le problème que j'ai en ce moment à savoir, d'avoir plusieurs sessions pour un utilisateur.

  4. #4
    Membre émérite
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Par défaut
    Le morceau de code que tu nous montre ne doit pas poser de problème, même avec 2 sessions ouvertes.

    peux tu montrer le code de création de la session ?

    et il se passe quoi si tu vires ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $_SESSION = array(); // $_SESSION est deja un tableau
    if (isset($_COOKIE[session_name()])) { // tu te ressert de ton cookie apres ?
        setcookie(session_name(), '', time()-42000, '/');
    }
    session_destroy(); // tu perds ta session la

  5. #5
    Membre éclairé Avatar de nicoaix
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 571
    Par défaut
    Je ne peux pas retirer cette partie de code pour voir ce qui se passe dans la mesure où mon site web est une application web actuellement en production...
    Donc si ça pose des problèmes de connexion je vais me retrouver avec tous les utilisateurs sur le dos...

    En ce qui concerne la création de la session elle se fait avec ce code:
    <?PHP
    session_start
    ();
    @
    $login = $_POST['login'];
    @
    $mdp = $_POST['mdp'];

    //Vérification du login et password
    $sql = "SELECT * FROM user WHERE login like '".$login."' AND pwd = '".md5($mdp)."'";
    $query = mysql_query($sql) or die ("Impossible d'exécuter la requête : ".$sql);
    $num = mysql_num_rows($query);

    if (
    $num == 1)
    {
    //Récupération de données de l'utilisateur
    @$id = mysql_result($query,0,'id');
    @
    $login_base = mysql_result($query,0,'login');
    @
    $nom = mysql_result($query,0,'nom');
    @
    $poste = mysql_result($query,0,'poste');
    @
    $mail = mysql_result($query,0,'mail');
    @
    $division = mysql_result($query,0,'division');
    @
    $code = mysql_result($query,0,'code');
    @
    $niveau = mysql_result($query,0,'niveau');
    @
    $pas = mysql_result($query,0,'pas');
    @
    $flag = mysql_result($query,0,'flag');
    @
    $acces_admin = mysql_result($query,0,'acces_admin');
    @
    $compte = mysql_result($query,0,'compte');
    //L'utilisateur est autentifié => création de la session
    $_SESSION["membre"] = TRUE;
    $_SESSION["login"] = $login_base;
    $_SESSION["id"] = $id;
    $_SESSION["nom"] = $nom;
    $_SESSION["mail"] = $mail;
    $_SESSION["poste"] = $poste;
    $_SESSION["division"] = $division;
    $_SESSION["code"] = $code;
    $_SESSION["niveau"] = $niveau;
    $_SESSION["pas"] = $pas;
    $_SESSION["flag"] = $flag;
    $_SESSION["acces_admin"] = $acces_admin;
    $_SESSION["compte"] = $compte;
    if(
    $niveau == 1){
    header("Location: accueil.php");
    }else{
    header("Location: choix.php");
    }
    }
    Colorez votre code PHP sur les forums grâce à Developpez.com

  6. #6
    Membre émérite
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Par défaut
    et il te servent a quoi les cookie ??

  7. #7
    Membre éclairé Avatar de nicoaix
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 571
    Par défaut
    Ben...euh... a rien je crois...
    ;-)

  8. #8
    Membre émérite
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Par défaut
    Duplique ton index en index2.php si il faut, mais je suis persuadé que les lignes que je t'ai conseillé de virer son en trop (surtout le destroy en fait)

  9. #9
    Membre éclairé Avatar de nicoaix
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 571
    Par défaut
    ok je vais essayer. Mais comment faire pour éviter d'avoir 2 sessions pour un même utilisateur?
    Ce que je voudrais c'est qu'il ne puisse pas y avoir 2 fichiers de sessions pour le même utilisateur.

  10. #10
    Membre émérite
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Par défaut
    Je ne crois pas qu'on puisse :

    tu n'as aucun moyen de savoir si l'utilisateur n'a pas fermer son explorateur. Le fait de fermer l'explorateur ne detruit pas la session.
    Si tu pouvais empécher que 2 sessions soient ouvertes sur le meme utilisateur, un utilisateur qui ferme son explorateur ne pourrait plus revenir sur ton site avant que sa session n'y soit détruite par timeout (timeout qui dépend de ta conf)...

  11. #11
    Membre éclairé Avatar de nicoaix
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 571
    Par défaut
    Je viens de comprendre mon problème (j'ai pas encore la solution):
    Si un même utilisateur se connecte à partir de 2 postes différents cela créé 2 sessions. Par contre, s'il se connecte sur 2 fenêtres à partir du même poste, alors la 2eme session créée écrase la première (ou la première est détruite et la 2eme est créée ce qui revient au même)

    Y' a-t-il donc un moyen pour éviter ça ou pas?
    Faudrait-il, à chaque connexion, rechercher par exemple l'adresse IP dans les fichier de session pour vérifier si la session existe déjà ou pas et ainsi autoriser ou non la connexion?

  12. #12
    Membre éclairé Avatar de nicoaix
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 571
    Par défaut
    Petite rectification... à partir du meme poste mais avec des fenetres différentes ça créée de nouvelles sessions... :-(

  13. #13
    Membre émérite
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Par défaut
    Je pense que t'es en train de te fourvoyer...

    Du meme PC ou pas, ça ne change rien. A la limite, la différence est si au cours de la navigation tu ouvres un lien dans une nouvelle fenetre, ce qui va dupliquer ta session sur 2 fenetres.

    MAis ouvrir 2 fenetre et te logger sur les 2 fenetres te fera 2 session au meme titre que si tu étais sur 2 PC. Cela pourrait avoir une incidence sur les cookies, mais pas sur les session.

    De plus, comment tu fais si ton serveur est en ligne et que les 2 PC sont sur le meme reseau local pour différencier leurs IP ?

    Je ne répondrais plus sans savoir ce que la suppression du session_destroy() fait.

    EDIT : a 2min pres...

  14. #14
    Membre éclairé Avatar de nicoaix
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 571
    Par défaut
    Pour répondre à ta question : la suppression du destroy ne change rien...

  15. #15
    Membre éclairé Avatar de nicoaix
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 571
    Par défaut
    En ce qui concerne l'architecture dans laquelle je travaille, il s'agit d'un réseau local dans lequel se trouve mon serveur. Tous les pc sont donc en local, de même que le serveur.

  16. #16
    Membre éclairé Avatar de nicoaix
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 571
    Par défaut
    Tu dis:
    "MAis ouvrir 2 fenetre et te logger sur les 2 fenetres te fera 2 session au meme titre que si tu étais sur 2 PC."
    Mais c'est justement ce que je cherche à éviter... Je veux qu'à chaque connexion (c'est à dire passage par le formulaire d'identification contenu dans la page index.php) si l'utilisateur avait une session ouverte, celle-ci soit détruite afin d'en créer une nouvelle.
    Ca permettrait de ne jamais avoir 2 sessions pour 1 utilisateur.

  17. #17
    Membre émérite
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Par défaut
    On s'en fiche de l'architecture...
    Si le fait d'avoir 2 session pour le meme utilisateur (que ça soit sur le meme pc, en local, sur le net, en wifi, sur 2 explorateur different ou meme dans 2 frames sur le meme navigateur) te plante, c'est que tu as de toute évidence un problème grave dans ton code...

    et apres virer le session_destroy(), t'as bien fermé / re-ouvert ton navigateur ?

    T'es bien sur que t'utilises les cookies nul-part ?

    parce que tant bien meme tu aurais voulu faire ça volontairement, ça aurait été difficile a faire...

    EDIT : t'as posté pendant que je répondais, mais 2 sessions pour le même utilisateur ne sont pas censé s'affecter entre elle ! ça devrait pas poser de problème et tu devrais même pas avoir a t'en soucier... Je sais pas comment t'as réussi ce coup la sans les cookies a vrai dire...

  18. #18
    Membre éclairé Avatar de nicoaix
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 571
    Par défaut
    Encore un rectificatif... session_destroy() a un intérêt...: en fait lorsqu'un utilisateur travaille correctement et clic sur le bouton déconnexion celui-ci redirige vers la page index.php et donc session_destroy() détruit sa session.

  19. #19
    Membre émérite
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Par défaut
    dans quelle page se trouve ta procédure de login ?

  20. #20
    Membre éclairé Avatar de nicoaix
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2004
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 571
    Par défaut
    Voici l'enchainement des premières pages:
    Page1 = index.php contient le formulaire demandant login et mot de passe.
    La soumission du formulaire envois à:
    Page2 = login.php contient la vérification du login et du mot de passe dans la base de données et si c'est ok alors créée les variables de session et renvois sur une page : accueil.php

Discussions similaires

  1. [Cookies] Sessions qui disparaissent
    Par schnito dans le forum Langage
    Réponses: 31
    Dernier message: 22/12/2006, 11h15
  2. [Cookies] Session et sous-domaines
    Par davmaster62 dans le forum Langage
    Réponses: 14
    Dernier message: 23/03/2006, 09h12
  3. Réponses: 12
    Dernier message: 14/02/2006, 19h03
  4. [Cookies] Session object destruction failed
    Par Paganoni dans le forum Langage
    Réponses: 2
    Dernier message: 11/01/2006, 09h38
  5. Réponses: 12
    Dernier message: 24/09/2003, 15h26

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