Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/11/2006, 12h22   #1
Membre éclairé
 
Avatar de nicoaix
 
Homme
Chef de projet MOA
Inscription : décembre 2004
Messages : 561
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 561
Points : 325
Points : 325
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 :
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.
nicoaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2006, 13h27   #2
Membre expérimenté
 
Inscription : mai 2002
Messages : 673
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 673
Points : 532
Points : 532
Rien a voir avec ta question, mais ça :

Citation:
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 ?
gloubi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2006, 13h45   #3
Membre éclairé
 
Avatar de nicoaix
 
Homme
Chef de projet MOA
Inscription : décembre 2004
Messages : 561
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 561
Points : 325
Points : 325
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 :
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.
nicoaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2006, 15h18   #4
Membre expérimenté
 
Inscription : mai 2002
Messages : 673
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 673
Points : 532
Points : 532
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 :
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
gloubi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2006, 15h59   #5
Membre éclairé
 
Avatar de nicoaix
 
Homme
Chef de projet MOA
Inscription : décembre 2004
Messages : 561
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 561
Points : 325
Points : 325
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:
Citation:
<?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
nicoaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2006, 16h17   #6
Membre expérimenté
 
Inscription : mai 2002
Messages : 673
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 673
Points : 532
Points : 532
et il te servent a quoi les cookie ??
gloubi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2006, 17h18   #7
Membre éclairé
 
Avatar de nicoaix
 
Homme
Chef de projet MOA
Inscription : décembre 2004
Messages : 561
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 561
Points : 325
Points : 325
Ben...euh... a rien je crois...
;-)
nicoaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2006, 17h24   #8
Membre expérimenté
 
Inscription : mai 2002
Messages : 673
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 673
Points : 532
Points : 532
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)
gloubi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2006, 17h28   #9
Membre éclairé
 
Avatar de nicoaix
 
Homme
Chef de projet MOA
Inscription : décembre 2004
Messages : 561
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 561
Points : 325
Points : 325
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.
nicoaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2006, 17h33   #10
Membre expérimenté
 
Inscription : mai 2002
Messages : 673
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 673
Points : 532
Points : 532
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)...
gloubi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2006, 17h43   #11
Membre éclairé
 
Avatar de nicoaix
 
Homme
Chef de projet MOA
Inscription : décembre 2004
Messages : 561
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 561
Points : 325
Points : 325
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?
nicoaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2006, 17h47   #12
Membre éclairé
 
Avatar de nicoaix
 
Homme
Chef de projet MOA
Inscription : décembre 2004
Messages : 561
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 561
Points : 325
Points : 325
Petite rectification... à partir du meme poste mais avec des fenetres différentes ça créée de nouvelles sessions... :-(
nicoaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2006, 17h49   #13
Membre expérimenté
 
Inscription : mai 2002
Messages : 673
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 673
Points : 532
Points : 532
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...
gloubi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2006, 18h21   #14
Membre éclairé
 
Avatar de nicoaix
 
Homme
Chef de projet MOA
Inscription : décembre 2004
Messages : 561
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 561
Points : 325
Points : 325
Pour répondre à ta question : la suppression du destroy ne change rien...
nicoaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2006, 18h22   #15
Membre éclairé
 
Avatar de nicoaix
 
Homme
Chef de projet MOA
Inscription : décembre 2004
Messages : 561
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 561
Points : 325
Points : 325
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.
nicoaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2006, 18h25   #16
Membre éclairé
 
Avatar de nicoaix
 
Homme
Chef de projet MOA
Inscription : décembre 2004
Messages : 561
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 561
Points : 325
Points : 325
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.
nicoaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2006, 18h30   #17
Membre expérimenté
 
Inscription : mai 2002
Messages : 673
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 673
Points : 532
Points : 532
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...
gloubi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2006, 18h31   #18
Membre éclairé
 
Avatar de nicoaix
 
Homme
Chef de projet MOA
Inscription : décembre 2004
Messages : 561
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 561
Points : 325
Points : 325
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.
nicoaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2006, 18h35   #19
Membre expérimenté
 
Inscription : mai 2002
Messages : 673
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 673
Points : 532
Points : 532
dans quelle page se trouve ta procédure de login ?
gloubi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2006, 10h48   #20
Membre éclairé
 
Avatar de nicoaix
 
Homme
Chef de projet MOA
Inscription : décembre 2004
Messages : 561
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2004
Messages : 561
Points : 325
Points : 325
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
nicoaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h19.


 
 
 
 
Partenaires

Hébergement Web