Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 26-10-2008 11:10:44

neojick
Membre
Date d'inscription: 13-04-2008
Messages: 223
Site web

Recréer une session avec un cookie

Bonjour,

plusieurs topics parlent de session, de cookie, mais il n'y a pas de topic unique traitant du cas suivant :

recréer automatiquement une session grâce à un cookie.

Je m'explique :

J'ai un site avec un espace membre.
Je vérifie si le visiteur est identifié sur le site :

Code:

        $auth = Zend_Auth::getInstance();    
        $membre = $auth->getIdentity();

Je souhaite autoriser le visiteur à rester identifié, grâce à un cookie, autant de temps qu'il le souhaite (jusqu'à ce qu'il clique sur "déconnexion" un jour).
Le RememberMe de ZF prolonge le cookie de session, certes, mais la session est killée du côté du serveur au bout de 24mn (par défaut).
Donc si le visiteur (connecté) est inactif + de 24mn, il n'est plus identifié.

Mon authentification se fait grâce à Zend_Auth, le membre est trouvé dans la BDD, l'authentification est validée.
Je me suis donc dis qu'en exécutant automatiquement une ré authentification si un cookie est trouvé (avec une clé par exemple dans le cookie liée à l'ID du membre dans une table précise), ça marcherait.
Et pourtant non. Je sais que je peux automatiser le truc en faisant une tambouille du style :

Lecture du cookie
Récupération du clé dans le cookie
Récupération dans une table du login et du pass de l'user liés à cette clé
Authentification automatique

Mais ça m'oblige à stocker le mdp en clair dans la table.


J'espère que mon explication n'est pas trop brouillon. Je suis sur que ce que j'essaye de faire est simple, mais je tourne en rond, et le peu de cas comme le mien sur ce forum me conforte dans l'idée que c'est normalement simple...

Quelqu'un est en mesurer de m'aider, ou du moins m'aiguiller ?

Merci d'avance.


Chan IRC de ZF en français : zftalk-fr

Hors ligne

 

#2 26-10-2008 16:27:44

Jean-Marc Rigade
Membre
Lieu: Rennes
Date d'inscription: 25-09-2007
Messages: 314

Re: Recréer une session avec un cookie

Je suis aussi intéressé par la problématique liée aux cookies telle que tu l'évoques.

Ceci dit, je ferais à ton problème une réponse simplement logique :

-Soit ton utilisateur entre son identifiant et son mot de passe (chiffré dans ta BDD) qui sont corrects, donc il est considéré comme identifié et connecté.

-soit tu le reconnais grâce à une clé stockée dans un cookie. Donc tu fais confiance à cette clé, dans ce cas à quoi bon utiliser le vrai mot de passe de l'utilisateur ?

Dans ce cas tu utilises une table purement interne, avec les identifiants des utilisateur et le même mot de passe pour tous, sachant que cette table n'est JAMAIS utilisée pour une connexion passant par un formulaire de saisie de l'identifiant et du mot de passe.

Donc cette table interne est réservée à la connexion automatique par le seul élément de "confiance", la clé numérique contenue dans le cookie.

Quand il y a du paiement en ligne cette identification automatique par cookie est à prendre avec précaution...

Hors ligne

 

#3 26-10-2008 16:38:31

neojick
Membre
Date d'inscription: 13-04-2008
Messages: 223
Site web

Re: Recréer une session avec un cookie

Il n'y a pas de paiement, bien entendu.

Je veux que le visiteur se connecte, et puisse ensuite rester connecté, donc session recréée grâce au cookie si elle a expirée.


Chan IRC de ZF en français : zftalk-fr

Hors ligne

 

#4 26-10-2008 17:39:09

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Recréer une session avec un cookie

Moi j'ai fais un système à la main qui relogue à  partir de hash conservés dans les cookies.
C'est facile a dire, et pas trop à faire wink

Hors ligne

 

#5 26-10-2008 17:48:13

Guillhomme
Membre
Date d'inscription: 09-10-2008
Messages: 102

Re: Recréer une session avec un cookie

Zend_Session possede une méthode statique setId

Je ne l'ai jamais testé, mais a priori si tu passes en parametre le numero de session  present dans le cookie, tu dois pouvoir retrouver la session sur le serveur.

Par contre, le numéro de session est effacé a la fermeture du navigateur, je ne me suis jamais preoccupé de ca, mais peut etre il faut l'enregistrer dans un vrai cookie que t'auras renseigner.

Hors ligne

 

#6 26-10-2008 17:56:48

neojick
Membre
Date d'inscription: 13-04-2008
Messages: 223
Site web

Re: Recréer une session avec un cookie

Guillhomme a écrit:

tu dois pouvoir retrouver la session sur le serveur

Ben non en fait, il faut recréer une session car PHP, par défaut, vire les sessions au bout de 24 minutes (1440 secondes). 1440 est la valeur par défaut de session.gc_maxlifetime. Je pourrais augmenter cette valeur, mais j'ai peur que ce soit un problème de sécurité.


Chan IRC de ZF en français : zftalk-fr

Hors ligne

 

#7 26-10-2008 18:43:27

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Recréer une session avec un cookie

Après avoir enregistré des cookies genre $_cookie['user_crendential'] : encryptMoiMaValeurMaisQueJePuisseLaDecrypterStp(md5($crendentiel)), moi j'ai un hook dans mon plugin d'initialisation que fait en gros:
si pas connecté et que cookie pour autologin goto login avec un decryptMoiMaVelur($_cookie['user_cred']) et dans ton sql tu fais Where ".decryptMoiMaVelur($_cookie['user_cred']))." = md5(table.user_credential)
En gros j'ai ca. Mon cookie est décryptable jusqu'à son md5 et vue que en sql le md5 marche je peux testé sur le md5.
En espérant que ca donne des pistes même si c'est pas clair smile

Hors ligne

 

#8 26-10-2008 18:56:47

neojick
Membre
Date d'inscription: 13-04-2008
Messages: 223
Site web

Re: Recréer une session avec un cookie

En relisant plusieurs fois c'est assez clair. Je vais tenter de voir ça.


Chan IRC de ZF en français : zftalk-fr

Hors ligne

 

#9 26-10-2008 20:33:31

Jean-Marc Rigade
Membre
Lieu: Rennes
Date d'inscription: 25-09-2007
Messages: 314

Re: Recréer une session avec un cookie

Mr.MoOx a écrit:

Après avoir enregistré des cookies genre $_cookie['user_crendential'] : encryptMoiMaValeurMaisQueJePuisseLaDecrypterStp(md5($crendentiel)), moi j'ai un hook dans mon plugin d'initialisation que fait en gros:
si pas connecté et que cookie pour autologin goto login avec un decryptMoiMaVelur($_cookie['user_cred']) et dans ton sql tu fais Where ".decryptMoiMaVelur($_cookie['user_cred']))." = md5(table.user_credential)
En gros j'ai ca. Mon cookie est décryptable jusqu'à son md5 et vue que en sql le md5 marche je peux testé sur le md5.
En espérant que ca donne des pistes même si c'est pas clair smile

ça correspond à la logique que j'avais décrite, sans toutefois détailler la technique qui peut prendre plusieurs biais.
Ce qui confirme qu'en effet le mot de passe n'est pas utile pour un "auto-login".

Gères-tu les cookies uniquement à travers Zend_Session ?

Hors ligne

 

#10 26-10-2008 20:46:05

Jean-Marc Rigade
Membre
Lieu: Rennes
Date d'inscription: 25-09-2007
Messages: 314

Re: Recréer une session avec un cookie

neojick a écrit:

Il n'y a pas de paiement, bien entendu.

Je veux que le visiteur se connecte, et puisse ensuite rester connecté, donc session recréée grâce au cookie si elle a expirée.

Personnellement j'utilise cette méthode pour maintenir la session et dans chacun de mes controllers :

Code:

function preDispatch() 
{
    if (Zend_Auth::getInstance()->hasIdentity()) 
    {
        $authSession = new Zend_Session_Namespace('Zend_Auth');
        $authSession->setExpirationSeconds(3600);
        $this->ident = Zend_Auth::getInstance()->getIdentity();
    }
    else 
    {
        $this->logger->debug('ident est false');
        $this->ident = false;
    }
}

je ne sais pas si je suis dans le vrai, mais même après 45 minutes d'inactivité, la session est toujours active.
Il ne semble donc pas que la limite de 1440 secondes soit une limite problématique.

Au delà d'une heure d'inactivité l'utilisateur doit se reconnecter, vu que je n'ai pas fait le choix des cookies.

Hors ligne

 

#11 26-10-2008 21:23:55

neojick
Membre
Date d'inscription: 13-04-2008
Messages: 223
Site web

Re: Recréer une session avec un cookie

Je regarde tout ceci dans la soirée. Merci


Chan IRC de ZF en français : zftalk-fr

Hors ligne

 

#12 26-10-2008 22:20:46

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Recréer une session avec un cookie

Ce qui confirme qu'en effet le mot de passe n'est pas utile pour un "auto-login".

C'est mieux d'avoir 2 clé qu'une... qui sait...

Hors ligne

 

#13 27-10-2008 10:08:41

neojick
Membre
Date d'inscription: 13-04-2008
Messages: 223
Site web

Re: Recréer une session avec un cookie

Jean-Marc Rigade a écrit:

Il n'y a pas de paiement, bien entendu.
je ne sais pas si je suis dans le vrai, mais même après 45 minutes d'inactivité, la session est toujours active.
Il ne semble donc pas que la limite de 1440 secondes soit une limite problématique.

Peux-tu vérifier avec un phpinfo la valeur de session.gc_maxlifetime sur ton serveur pour voir si elle est a 1440 ?[

Dernière modification par neojick (27-10-2008 10:09:01)


Chan IRC de ZF en français : zftalk-fr

Hors ligne

 

#14 27-10-2008 11:03:26

Jean-Marc Rigade
Membre
Lieu: Rennes
Date d'inscription: 25-09-2007
Messages: 314

Re: Recréer une session avec un cookie

Mr.MoOx a écrit:

Ce qui confirme qu'en effet le mot de passe n'est pas utile pour un "auto-login".

C'est mieux d'avoir 2 clé qu'une... qui sait...

Je suis de ton avis, mais si le cookie ne te donne comme information d'identification qu'une clé que tu as créée et un identifiant, mais ne contient pas le mot de passe, tu peux tout aussi bien tester l'age du capitaine sans être plus avancé qu'en testant un mot de passe que l'utilisateur ne vient pas de te donner.

Mais bon c'est pas le débat...

Hors ligne

 

#15 27-10-2008 11:50:39

Jean-Marc Rigade
Membre
Lieu: Rennes
Date d'inscription: 25-09-2007
Messages: 314

Re: Recréer une session avec un cookie

neojick a écrit:

Jean-Marc Rigade a écrit:

Il n'y a pas de paiement, bien entendu.
je ne sais pas si je suis dans le vrai, mais même après 45 minutes d'inactivité, la session est toujours active.
Il ne semble donc pas que la limite de 1440 secondes soit une limite problématique.

Peux-tu vérifier avec un phpinfo la valeur de session.gc_maxlifetime sur ton serveur pour voir si elle est a 1440 ?[

J'ai en effet 1440 dans session.gc_maxlifetime.
Mais je viens de tester pour être certain à 100% et en me connectant a cette heure là (ligne de ma log sur le serveur de production) dernière ligne de la log après connexion :

Code:

-    66142    *2s2ndvc4i7b9mj9q665kvf2mv2* 2008-10-27T11:05:30+01:00 DEBUG (7): cle : 1 - /sportif/visu

Et en restant inactif pendant plus de 30 minutes (première ligne de log lors d'un click) :

Code:

-    73712    *2s2ndvc4i7b9mj9q665kvf2mv2* 2008-10-27T11:37:50+01:00 INFO (6): bootstrap 1.6.2 - /entraineur/recherche

ma session est toujours active et valide, ce qui n'est plus le cas si je reste une heure sans aucune action...

Hors ligne

 

#16 27-10-2008 12:32:39

neojick
Membre
Date d'inscription: 13-04-2008
Messages: 223
Site web

Re: Recréer une session avec un cookie

Tu n'a pas un traitement ajax qui se relance tout seul qui réactive la session ?

Sinon de mon côté j'ai quasiment terminé de mettre en place l'idée de Mr.MoOx, il me reste seulement à réfléchir à un bon encryptMoiMaValeurMaisQueJePuisseLaDecrypterStp();


Chan IRC de ZF en français : zftalk-fr

Hors ligne

 

#17 27-10-2008 12:41:54

Jean-Marc Rigade
Membre
Lieu: Rennes
Date d'inscription: 25-09-2007
Messages: 314

Re: Recréer une session avec un cookie

neojick a écrit:

Tu n'a pas un traitement ajax qui se relance tout seul qui réactive la session ?

Négatif, rien de ce genre.
(Et je confesse ne pas maîtriser la mise à jour partielle de mes pages avec Dojo)
Donc non, rien que du pur PHP et HTML...

Hors ligne

 

#18 27-10-2008 12:55:21

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: Recréer une session avec un cookie

Hello,

Tu n'utilises pas un ini_set('session.save_path', 'mon/dossier/perso') ?

Je crois avoir lu mais je voudrais pas dire une connerie que quand tu fais ça, le nettoyeur de PHP ne fonctionne plus et c'est à toi de gérer ton dossier de sessions et donc la destruction des sessions inactives.

Edit : je viens de trouver où je l'avais lu, c'est tout simplement dans le php.ini

; NOTE: If you are using the subdirectory option for storing session files
;       (see session.save_path above), then garbage collection does *not*
;       happen automatically.  You will need to do your own garbage
;       collection through a shell script, cron entry, or some other method.
;       For example, the following script would is the equivalent of
;       setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes):
;          cd /path/to/sessions; find -cmin +24 | xargs rm

A+

Dernière modification par mikaelkael (27-10-2008 13:04:58)


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#19 27-10-2008 13:29:20

Jean-Marc Rigade
Membre
Lieu: Rennes
Date d'inscription: 25-09-2007
Messages: 314

Re: Recréer une session avec un cookie

Ben non rien de tout ça.
Si je reste inactif plus de 3600 secondes la session devient invalide.
Ma plateforme de production est basée sur Win2003 serveur et Zend Core.
Voici mon php.ini pour les sessions :

Code:

[Session]
; Handler used to store/retrieve data.
session.save_handler = files

; Argument passed to save_handler.  In the case of files, this is the path
; where data files are stored. Note: Windows users have to change this
; variable in order to use PHP's session functions.
;
; As of PHP 4.0.1, you can define the path as:
;
;     session.save_path = "N;/path"
;
; where N is an integer.  Instead of storing all the session files in
; /path, what this will do is use subdirectories N-levels deep, and
; store the session data in those directories.  This is useful if you
; or your OS have problems with lots of files in one directory, and is
; a more efficient layout for servers that handle lots of sessions.
;
; NOTE 1: PHP will not create this directory structure automatically.
;         You can use the script in the ext/session dir for that purpose.
; NOTE 2: See the section on garbage collection below if you choose to
;         use subdirectories for session storage
;
; The file storage module creates files using mode 600 by default.
; You can change that by using
;
;     session.save_path = "N;MODE;/path"
;
; where MODE is the octal representation of the mode. Note that this
; does not overwrite the process's umask.
;session.save_path = "/tmp"

; Whether to use cookies.
session.use_cookies = 1

; This option enables administrators to make their users invulnerable to
; attacks which involve passing session ids in URLs; defaults to 0.
; session.use_only_cookies = 1

; Name of the session (used as cookie name).
session.name = PHPSESSID

; Initialize session on request startup.
session.auto_start = 0

; Lifetime in seconds of cookie or, if 0, until browser is restarted.
session.cookie_lifetime = 0

; The path for which the cookie is valid.
session.cookie_path=/

; The domain for which the cookie is valid.
session.cookie_domain =

; Handler used to serialize data.  php is the standard serializer of PHP.
session.serialize_handler = php

; Define the probability that the 'garbage collection' process is started
; on every session initialization.
; The probability is calculated by using gc_probability/gc_divisor,
; e.g. 1/100 means there is a 1% chance that the GC process starts
; on each request.

session.gc_probability = 1
session.gc_divisor     = 1000

; After this number of seconds, stored data will be seen as 'garbage' and
; cleaned up by the garbage collection process.
session.gc_maxlifetime = 1440

; NOTE: If you are using the subdirectory option for storing session files
;       (see session.save_path above), then garbage collection does *not*
;       happen automatically.  You will need to do your own garbage
;       collection through a shell script, cron entry, or some other method.
;       For example, the following script would is the equivalent of
;       setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes):
;          cd /path/to/sessions; find -cmin +24 | xargs rm

; PHP 4.2 and less have an undocumented feature/bug that allows you to
; to initialize a session variable in the global scope, albeit register_globals
; is disabled.  PHP 4.3 and later will warn you, if this feature is used.
; You can disable the feature and the warning seperately. At this time,
; the warning is only displayed, if bug_compat_42 is enabled.

session.bug_compat_42 = 0
session.bug_compat_warn = 1

; Check HTTP Referer to invalidate externally stored URLs containing ids.
; HTTP_REFERER has to contain this substring for the session to be
; considered as valid.
session.referer_check =

; How many bytes to read from the file.
session.entropy_length = 0

; Specified here to create the session id.
session.entropy_file =

;session.entropy_length = 16

;session.entropy_file = /dev/urandom

; Set to {nocache,private,public,} to determine HTTP caching aspects
; or leave this empty to avoid sending anti-caching headers.
session.cache_limiter = nocache

; Document expires after n minutes.
session.cache_expire = 180

Si je comprends bien ce que tu me dis, mon code fonctionne mais il ne devrait pas, c'est ça ?

Dernière modification par Jean-Marc Rigade (27-10-2008 13:30:54)

Hors ligne

 

#20 27-10-2008 13:32:33

neojick
Membre
Date d'inscription: 13-04-2008
Messages: 223
Site web

Re: Recréer une session avec un cookie

Logiquement la session devrait être détruite au bout de 1440sc d'inactivité il me semble.


Chan IRC de ZF en français : zftalk-fr

Hors ligne

 

#21 27-10-2008 13:37:21

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: Recréer une session avec un cookie

Hello,

Et si tu mets (pour le test) :

Code:

session.gc_probability = 1
session.gc_divisor     = 1

Le nettoyeur va s'exécuter à chaque requête. Ton traffic est-il >1000 requêtes par heures ?

A+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#22 27-10-2008 13:38:17

Jean-Marc Rigade
Membre
Lieu: Rennes
Date d'inscription: 25-09-2007
Messages: 314

Re: Recréer une session avec un cookie

neojick a écrit:

Logiquement la session devrait être détruite au bout de 1440sc d'inactivité il me semble.

Oui mais donc ce code executé dans les init() de tous les controllers :

Code:

$authSession = new Zend_Session_Namespace('Zend_Auth');
$authSession->setExpirationSeconds(3600);

qui pour moi semble fonctionner, ne devrait pas être efficace.
Donc dans quel cas ce code est utile si ce n'est pour régler le temps qui doit s'écouler sans action de l'utilisateur avant expiration ?

Hors ligne

 

#23 27-10-2008 13:49:01

Jean-Marc Rigade
Membre
Lieu: Rennes
Date d'inscription: 25-09-2007
Messages: 314

Re: Recréer une session avec un cookie

mikaelkael a écrit:

Hello,

Et si tu mets (pour le test) :

Code:

session.gc_probability = 1
session.gc_divisor     = 1

Le nettoyeur va s'exécuter à chaque requête. Ton traffic est-il >1000 requêtes par heures ?

A+

Voui, vu que c'est en prod je reste prudent sur les tests...
Plus de 1000 requêtes à l'heure, à certains moments de la journée, oui.

Tes modifications sont censées faire quoi ?

Hors ligne

 

#24 27-10-2008 14:08:21

neojick
Membre
Date d'inscription: 13-04-2008
Messages: 223
Site web

Re: Recréer une session avec un cookie

Jean-Marc Rigade a écrit:

neojick a écrit:

Logiquement la session devrait être détruite au bout de 1440sc d'inactivité il me semble.

Oui mais donc ce code executé dans les init() de tous les controllers :

Code:

$authSession = new Zend_Session_Namespace('Zend_Auth');
$authSession->setExpirationSeconds(3600);

qui pour moi semble fonctionner, ne devrait pas être efficace.
Donc dans quel cas ce code est utile si ce n'est pour régler le temps qui doit s'écouler sans action de l'utilisateur avant expiration ?

Je sais pas du tout. Je commence à tout mélanger là. La durée de la session côté navigateur, côté serveur. Étant en plus malade aujourd'hui, je passe mon tour pour réfléchir là dessus maintenant.


Chan IRC de ZF en français : zftalk-fr

Hors ligne

 

#25 27-10-2008 14:13:10

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: Recréer une session avec un cookie

Hello,

Le nettoyeur de session s'exécute 1 (probability) requête sur 1000 (divisor). Si tu as peu de requêtes (10 par heure par ex.), le nettoyeur s'exécute donc en moyenne toutes les 100 heures. Tant que le fichier de session n'a pas été effacé, pour moi il est actif même si sa date est dépassée.

La session.gc_maxlifetime est utilisée par le nettoyeur de session au moment où il s'exécute. Avec mes valeurs, il s'exécutera (probablement) à chaque requête puisque 1/1 = 1.

A+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages