Annonce

#1 2006-07-21 22:10:00

nicolas
Former Piwigo Team
2004-12-30
1561

Le fonctionnement des sessions.

Comme visiblement cela pose des problèmes je vais tenter de vous expliquer comment fonctionnent les sessions. Je fais cela suite aux différents bugs rapportés récemment notament:
http://bugs.phpwebgallery.net/view.php?id=451

Une session est un mécanisme qui vise à pallier au fait que le protocole http est non connecté (même http 1.1!). Le principe: on transmet entre serveur et navigateur une clé (un identifiant de session) qui permet de garder la connexion. Dans la pratique, l'indentifiant de session est stocké dans le navigateur dans un cookie avec une durée de vie de 0 (c'est-à-dire que le cookie est supprimé à la fermeture du navigateur) et côté serveur un fichier, ayant comme nom l'identifiant de session, est crée contenant toutes les informations que l'on veut garder d'une page à une autre. Dans le cas qui nous intéresse on garde d'une page à une autre l'identifiant de l'utilisateur.

Etablissement de la connexion: l'utilisateur entre un couple login/ot de passe correct et une nouvelle session est créee. La création de la session se fait en créant le fichier côté serveur et en envoyant le cookie au client. Tout cela est fait avec la fonction session_start(). Après sur les pages suivantes on vérifie que la session est toujours valide. Pour que la session soit valide il faut que le cookie existe, que le fichier sur le serveur existe et que le dernier accès à ce fichier date de moins de session_length (1440 secondes). Si le dernier accès au fichier est plus ancien ou si le cookie n'existe plus alors la session est périmée et elle est détruite.

Il ne faut pas augmenter la durée de vie d'une session. Elle doit être courte. Par défaut elle est de 1440 secondes (soit 24 minutes). Plus les "données" à protéger sont sensibles plus il faut réduire la durée de vie de la session. Une session ne dure que le temps d'une visite. Au maximum il ne peut y avoir que session_length (1440) secondes entre deux clicks pour maintenir la session. Ce n'est pas une bonne idée de vouloir augmenter cette durée. On s'expose à plus de risques de vols de sessions (cf doc php). Ce n'est pas le site d'une banque mais autant faire les choses biens.

Mais pour pouvoir maintenir dans la durée une session plus longtemps ou plutôt pour éviter d'avoir à se reconnecter il faut utiliser le cookie "remember me" auquel on donne la durée de vie que l'on veut (1 an par exemple configurable dans config_default.inc.php). Ce cookie permet de recréer une nouvelle session automatiquement mais en aucun cas de maintenir ou rétablir une session périmée. Pour pouvoir recréer une nouvelle session il est hors de question de stocker côté client login et mot de passe dans un cookie. On va créer une clé unique (avec md5(uniqid()) par exemple) que l'on va stocker côté client dans un cookie avec une durée de vie longue (genre un an) et que l'on stocke côté serveur pour s'assurer que cette clé correspond à un compte valide. Si le cookie est valide et qu'il correspond à un compte valide (c'est-àdire qu'il y a déjà eu une ouverture de session avec ce compte) alors on ouvre une nouvelle session dans le cas où la précédente a pris fin. Si on se déconnecte manuellement on supprime ce cookie et on détruit la session. Si on ferme son navigateur et qu'on le réouvre, une nouvelle session est créee.

J'espère avoir été clair. N'hésitez pas à me poser des questions.

p.s: j'ai donné ces explications en me basant sur une gestion des sessions avec fichiers mais dans une base de données le principe est le même.


Donnez du peps à vos tags
Laissez vos visiteurs vous aidez à tagger vos images avec user_tags

Hors ligne

#2 2006-07-21 22:47:54

chrisaga
Former Piwigo Team
France (92)
2005-08-10
566

Re: Le fonctionnement des sessions.

OK, c'est clair.
Mais finalement par rapport au bug 451 ?
Je suis connecté à Gna! et à mantis depuis plusieurs browsers sur plusieurs machines, et l'autologin fonctionne bien.

<:o)

Dernière modification par chrisaga (2006-07-21 22:48:07)


Utilisateur depuis la version 1.3, Impliqué depuis la 1.4, Responsable du template des 1.5 et 1.6  ... et en (in)disponibilité sur la 1.7

Hors ligne

#3 2006-07-21 22:51:53

mathiasm
Former Piwigo Team
2006-02-06
2692

Re: Le fonctionnement des sessions.

chris, je pense qu'il récupère l'id unique s'il existe déjà.

Hors ligne

#4 2006-07-21 23:31:01

chrisaga
Former Piwigo Team
France (92)
2005-08-10
566

Re: Le fonctionnement des sessions.

mathiasm a écrit:

chris, je pense qu'il récupère l'id unique s'il existe déjà.

Donc on peut faire pareil ?


Utilisateur depuis la version 1.3, Impliqué depuis la 1.4, Responsable du template des 1.5 et 1.6  ... et en (in)disponibilité sur la 1.7

Hors ligne

#5 2006-07-21 23:53:33

mathiasm
Former Piwigo Team
2006-02-06
2692

Re: Le fonctionnement des sessions.

oui, il "suffit" de vérifier l'existence de l'id utilisateur dans la table sessions.

Hors ligne

#6 2006-07-22 02:51:44

rvelices
Équipe Piwigo
2005-12-29
1417

Re: Le fonctionnement des sessions.

Salut,
Pour ma galerie ca ne me derrangerait pas si la session etait plus longue (du genre 2 semaines - qu'on prolonge a chaque visite) car je ne suis pas une banque ( malheuresement :-) ).
Je ne sais pas quel modele tu veux utiliser pour sauver la cle aditionnelle, mais il faut qu'un user ait la possibilite d'avoir plusieurs sessions avec remember me a la fois (comme en 1.5 - mon PC au boulot et a la maison).
Sinon il y a aussi une solution beaucoup plus simple: si remember_me, on stocke cette variable dans la session et ensuite dans le garbage collector on supprime les lignes avec qq de ce genre:

Code:

WHERE 
  UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(expiration) > '.$conf['remember_me_length'].'
OR 
  ( UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(expiration) > '.$conf['session_length'].'
    AND
    data NOT LIKE '%remember_me%'
  )

C'est juste 5-6 lignes de code a ajouter et ca ne demande pas un changement de base.

Mais ma conclusion: Je suis OK avec tout tant que ca marche correctement.

Hors ligne

#7 2006-07-23 13:27:49

nicolas
Former Piwigo Team
2004-12-30
1561

Re: Le fonctionnement des sessions.

Désolé d'avoir tardé à répondre.

chrisaga a écrit:

OK, c'est clair.
Mais finalement par rapport au bug 451 ?
Je suis connecté à Gna! et à mantis depuis plusieurs browsers sur plusieurs machines, et l'autologin fonctionne bien.

Je n'ai pas encore eu le temps de regarder dans les détails. je n'ai pas regardé non plus ta correction. Mais promis c'est dans la todo list! :-)

mathiasm a écrit:

chris, je pense qu'il récupère l'id unique s'il existe déjà.
oui, il "suffit" de vérifier l'existence de l'id utilisateur dans la table sessions.

si tu parles de l'identifiant de session, ce n'est absolument pas comme cela qu'il faut faire. Cet identifiant ne sert qu'à associer une personne avec sa session. Et on ne sert de cet identifiant que pour une seule session: une session = une visite.

rvelices a écrit:

Pour ma galerie ca ne me derrangerait pas si la session etait plus longue (du genre 2 semaines - qu'on prolonge a chaque visite) car je ne suis pas une banque ( malheuresement :-) ).

Le délai d'expiration de la session (session.length) permet d'éviter les problèmes de sécurité. En effet, il suffit que quelqu'un récupère cet identifiant
et le communique dans sa requête et il utilise les données de sessions de quelqu'un d'autre. Pour la personne qui n'a pas accès à votre ordinateur, le seul moyen d'avoir votre identifiant, c'est de tester toutes les valeurs possibles de cet indetifiant en espérant tomber sur le votre. Seulement, le nombre de possibilité étant considérable, cela peut prendre énormément de temps. Et comme la durée de vie du fichier de session est de 24 minutes, cela réduit (mais n'annule pas) les possibilités de piratage de cet identifiant.

rvelices a écrit:

Je ne sais pas quel modele tu veux utiliser pour sauver la cle aditionnelle, mais il faut qu'un user ait la possibilite d'avoir plusieurs sessions avec remember me a la fois (comme en 1.5 - mon PC au boulot et a la maison).

j'ai bien noté cela.

rvelices a écrit:

Sinon il y a aussi une solution beaucoup plus simple: si remember_me, on stocke cette variable dans la session et ensuite dans le garbage collector on supprime les lignes avec qq de ce genre:

Code:

WHERE 
  UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(expiration) > '.$conf['remember_me_length'].'
OR 
  ( UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(expiration) > '.$conf['session_length'].'
    AND
    data NOT LIKE '%remember_me%'
  )

C'est juste 5-6 lignes de code a ajouter et ca ne demande pas un changement de base.

Mais ma conclusion: Je suis OK avec tout tant que ca marche correctement.

Non je ne suis pas d'accord avec cela. Tu veux augmenter la durée de vie des sessions ce qui, comme je viens de l'expliquer, est dangereux.

Pour compléter ma réponse voilà comment je vois le fonctionnement de l'auto-login.
L'idée est comme je le disais d'autoriser la création d'une nouvelle session si un cookie avec une clé existe.

La première idée serait de stocker login et mot de passe chiffré dans le cookie. C'est évidemment une mauvaise idée. Si le cookie est lu ou volé (par une faille XSS) le compte est compromis et l'utilisateur devra changer son mot de passe. Curieusement cette très mauvaise méthode est utilisée par dotclear, punbb, ... J'ai du mal à comprendre. La seule explication que j'y trouve: la flemme de développer un vrai système sécurisé.

La clé va donc être aléatoire (à base de base64_encode, md5 et uniq_id). Il va falloir modifier la table users pour y ajouter un champ contenant la clé. Ce champ ne servira que si la personne demande à être identifié automatiquement.

Voilà comment tout cela fonctionne.
Supposons que la personne demande à s'identifie (pour la première fois) et demande à être identifier automatiquement. On fait:
1) vérification du login/mot de passe
2) lecture de la clé (dans la base)
3) la clé est nulle alors génération d'une clé.
4) enregirstrement de la clé et du login dans un cookie de durée de vie géré par $conf['remember_me_length'] (dans include/config_default.inc)
5) ouverture de la session

Lorsque l'utilisateur revient après plusieurs jours:
1) pas de données dans la session (user_id) donc c'est une nouvelle session.
2) la personne a une clé d'auto-identification: on vérifie la validité du couple login/clé
3) si tout est correct on ouvre la session sinon demande d'identification login/mot de passe

L'utilisateur se connecte depuis un autre poste:
1) vérification du login/mot de passe
2) lecture de la clé (dans la base)
3) la clé n'est pas nulle
4) enregirstrement de la clé et du login dans un cookie de durée de vie géré par $conf['remember_me_length'] (dans include/config_default.inc)
5) ouverture de la session

Quelques remarques:
- si le login/clef n'est pas correct du premier coup, on efface la clef de la base car cela peut être considéré comme une tentative de piratage de la clef d'autoidentification.
- pour la déconnexion on offre deux possibilités (sous forme d'une case à cocher par exemple): suppression de la session courante et si la case est cochée suppression de la session courante et suppression de la clé d'autoidentification.

Dernière modification par nicolas (2006-07-23 13:42:59)


Donnez du peps à vos tags
Laissez vos visiteurs vous aidez à tagger vos images avec user_tags

Hors ligne

#8 2006-07-23 17:04:45

nicolas
Former Piwigo Team
2004-12-30
1561

Re: Le fonctionnement des sessions.

Je mets tout ça en place sur le tronc.

C'est fait

J'attends un retour pour fermer le bug et reporter dans la branche 1.6

Il manque la suppression du cookie remember_me pour par exemple se connecter avec un autre utilisateur.
En fait le lien se déconnecter ne supprime que la session courante mais si on s'est connecté avec auto-login on est automatiquement reconnecté.

Je ne sais pas trop de quelle manière le mettre en place. L'idée de la case à cocher à côté de se déconnecter vous parait-elle bonne ? Ou alors un autre lien: détruire ma clé d'auto-login ce qui permettrait de se dé-auto-identifier sur tous les postes. Cela peut arriver par exemple si on a quitté sa société et comme un con, on a oublié d'effacer l'historique/cache/cookie avant de partir.

Je me demande s'il ne faut pas aussi prévoir dans la partie administration un lien "supprimer toutes les clés d'auto-login" au même titre que "purger les sessions".

Dernière modification par nicolas (2006-07-23 17:28:38)


Donnez du peps à vos tags
Laissez vos visiteurs vous aidez à tagger vos images avec user_tags

Hors ligne

#9 2006-07-23 23:39:07

rub
Former Piwigo Team
Lille
2005-08-26
5239

Re: Le fonctionnement des sessions.

nicolas a écrit:

...
Voilà comment tout cela fonctionne.
Supposons que la personne demande à s'identifie (pour la première fois) et demande à être identifier automatiquement. On fait:
1) vérification du login/mot de passe
2) lecture de la clé (dans la base)
3) la clé est nulle alors génération d'une clé.
4) enregirstrement de la clé et du login dans un cookie de durée de vie géré par $conf['remember_me_length'] (dans include/config_default.inc)
5) ouverture de la session

Lorsque l'utilisateur revient après plusieurs jours:
1) pas de données dans la session (user_id) donc c'est une nouvelle session.
2) la personne a une clé d'auto-identification: on vérifie la validité du couple login/clé
3) si tout est correct on ouvre la session sinon demande d'identification login/mot de passe

L'utilisateur se connecte depuis un autre poste:
1) vérification du login/mot de passe
2) lecture de la clé (dans la base)
3) la clé n'est pas nulle
4) enregirstrement de la clé et du login dans un cookie de durée de vie géré par $conf['remember_me_length'] (dans include/config_default.inc)
5) ouverture de la session
...

Cela ne rique pas de poser un problème avec les users génériques qui permettent d'avoir plusieurs utilisateurs pour le même compte et connectés en même temps?
En y refléchissant, je ne pense pas car toute le monde aura la même clef, le seul hic, c'est de ne plus mettre à jour la clef une fois celle-ci déterminée.


nicolas a écrit:

Je ne sais pas trop de quelle manière le mettre en place. L'idée de la case à cocher à côté de se déconnecter vous parait-elle bonne ? Ou alors un autre lien: détruire ma clé d'auto-login ce qui permettrait de se dé-auto-identifier sur tous les postes. Cela peut arriver par exemple si on a quitté sa société et comme un con, on a oublié d'effacer l'historique/cache/cookie avant de partir.

Quelque soit la solution attention aux users génériques.
Plutot pour la destruction/réinit de la clef de connexion.


nicolas a écrit:

Je me demande s'il ne faut pas aussi prévoir dans la partie administration un lien "supprimer toutes les clés d'auto-login" au même titre que "purger les sessions".

Oui, ca peut servir.

Hors ligne

#10 2006-07-23 23:40:39

mathiasm
Former Piwigo Team
2006-02-06
2692

Re: Le fonctionnement des sessions.

Pour moi, si l'utilisateur se déconnecte, on purge l'auto-login avec. Sinon, la déconnexion n'a pas de sens.

Hors ligne

#11 2006-07-23 23:51:28

rub
Former Piwigo Team
Lille
2005-08-26
5239

Re: Le fonctionnement des sessions.

mathiasm a écrit:

Pour moi, si l'utilisateur se déconnecte, on purge l'auto-login avec. Sinon, la déconnexion n'a pas de sens.

Ce ne convient aux fonctionnement multi-poste. (maison + bureau).
Si je me deconnecte du bureau pourquoi me déconnecter de la maison?

Hors ligne

#12 2006-07-23 23:53:19

rub
Former Piwigo Team
Lille
2005-08-26
5239

Re: Le fonctionnement des sessions.

Actuellement en me déconnectant, j'ai

Notice: unserialize(): Error at offset 5 of 93 bytes in d:\dev\bsf\identification.php on line 76

SELECT auto_login_key
  FROM phpwebgallery_users
  WHERE id =
;
[mysql error 1064] Erreur de syntaxe près de '' à la ligne 3

Hors ligne

#13 2006-07-24 00:05:07

rub
Former Piwigo Team
Lille
2005-08-26
5239

Re: Le fonctionnement des sessions.

rub a écrit:

Actuellement en me déconnectant, j'ai

Notice: unserialize(): Error at offset 5 of 93 bytes in d:\dev\bsf\identification.php on line 76

SELECT auto_login_key
  FROM phpwebgallery_users
  WHERE id =
;
[mysql error 1064] Erreur de syntaxe près de '' à la ligne 3

Pour info, j'ai  paramétré $conf['guest_access'] = false;

Hors ligne

#14 2006-07-24 00:13:53

rvelices
Équipe Piwigo
2005-12-29
1417

Re: Le fonctionnement des sessions.

nicolas a écrit:

Je mets tout ça en place sur le tronc.
C'est fait

Je dois faire une connerie car ca ne marche pas ... Je me loggue avec remember me, je recois la cookie, mais une fois la session detruite de la base, ca ne me loggue pas automatiquement.

Hors ligne

#15 2006-07-24 00:19:38

mathiasm
Former Piwigo Team
2006-02-06
2692

Re: Le fonctionnement des sessions.

rub a écrit:

mathiasm a écrit:

Pour moi, si l'utilisateur se déconnecte, on purge l'auto-login avec. Sinon, la déconnexion n'a pas de sens.

Ce ne convient aux fonctionnement multi-poste. (maison + bureau).
Si je me deconnecte du bureau pourquoi me déconnecter de la maison?

Je me suis mal exprimé, je parlais du cookie.

Pour l'id, la purge se fait dans le profil utilisateur:
- case à cocher dans "Personnalisation"
- bouton ou lien dans la zone "identification" du menu, genre "RAZ autoconnexion". Il peut rester connecté et juste désactiver l'auto-login pour les prochaines fois.

Hors ligne

Pied de page des forums

Propulsé par FluxBB

github twitter newsletter Faire un don Piwigo.org © 2002-2024 · Contact