Expiration des sessions

Eléphanteau du PHP | 18 Messages

20 juil. 2005, 08:59

Bonjour,
Je voudrais que mes sessions soient assez courtes: 1 min pour tester.
Pour cela, j'ai changé ces lignes dans /usr/local/lib/php.ini (j'espère que c'est le bon fichier !).

Code : Tout sélectionner

session.cache_expire = 1 session.gc_maxlifetime = 60
Pour faire le test, je rentre dans la page suivante et puis j'attends plus d'une minute (et même toute cette nuit !).

Code : Tout sélectionner

<? session_start(); // check if the previous ip client was the same that the current (anti vol de session) if(isset($_SESSION['ip_client']) && ($_SESSION['ip_client'] != $_SERVER['REMOTE_ADDR'])) { session_destroy(); // redirection on the login page session_start(); header('Location: login.php'); } //etc ....
Ensuite, si je fais un "refresh" de ma page, je pense que les variables $_SESSION devraient avoir disparu. Poutant ma page se réaffiche entièrement et j'ai bien une trace de relecture dans le fichier log de apache. (Je suis sous apache 2.0.54 et PHP 5.0.4)
Merci de m'avoir lu et de votre aide

Administrateur PHPfrance
Administrateur PHPfrance | 430 Messages

20 juil. 2005, 10:36

Note : Si vous utilisez le gestionnaire de session par fichier, qui est fourni par défaut votre système doit garder la trace des dates de dernier accès aux fichier (atime). La FAT de Windows ne le fait pas, alors vous faudra trouver un autre système pour gérer les sessions qui ont expirées.
=> si t'est sous windows faut le faire "à la main"
"... demanda à voir le CV du recruteur pour être sûr que le chef du personnel était compétent".

Eléphanteau du PHP | 18 Messages

20 juil. 2005, 11:42

Merci de ta réponse Cerber,
Je suis sous UNIX. C'est le même problème?
Je vois dans ta réponse
Si vous utilisez le gestionnaire de session par fichier.....
Il existe un autre système?
Merci

Mammouth du PHP | 543 Messages

20 juil. 2005, 12:41

les sessions sont gérées par fichier ou par cookie ?

Colle tes infos du phpinfo() pour la partie session

Administrateur PHPfrance
Administrateur PHPfrance | 430 Messages

20 juil. 2005, 13:18

en fait pour gerer les sessions deux systemes sont utilisés simultanéments :
  • le systeme de transfert de l'identifiant de session (SID) qui passe
    • par des cookies (variable php.ini session.use_cookies)
    • par les urls (variable php.ini session.use_trans_sid)
    • les deux (par défaut)
  • le systeme de stockage des variables de sessions qui marche
    • par fichier (par défaut) (a un SID correspond un fichier dans le répertoire de session)
    • en base de donnée (mysql ou sqlite)
    • par cookie ATTENTION : mode très dangereux : rien n'empeche le client de modifier ses infos lui même
    • tu peux même écrire les tients avec la fontction session_set_save_handler ()
"... demanda à voir le CV du recruteur pour être sûr que le chef du personnel était compétent".

Administrateur PHPfrance
Administrateur PHPfrance | 430 Messages

20 juil. 2005, 13:37

Je suis sous UNIX. C'est le même problème?
ben non, mais bon on peut tenter d'émuler le GC :
a mettre en haut de chaque page après le session start :
if(isset($_SESSION['__EMUL_GC__']) && $_SESSION['__EMUL_GC__']>time()+60){//60 secondes Max
  session_destroy();
  session_start();
}
$_SESSION['__EMUL_GC__']=time();
"... demanda à voir le CV du recruteur pour être sûr que le chef du personnel était compétent".

ViPHP
ViPHP | 1380 Messages

20 juil. 2005, 16:52

Il y trois directives qui commandent la durée des fichiers de sessions côté serveur:

session.gc_maxlifetime = 1 (citée plus haut)
session.gc_probability = 100
session.gc_divisor = 100

Le rapport gc_probability/gc_divisor donne la probabilité de mise en route du GC à chaque demande de session. Ici, à chaque sollicitation du fichier de session, il y a 100% de chance que le GC nettoye le répertoire de session et efface les fichiers obsolètes (dans ce cas, vieux de plus d'une seconde).

Le mieux c'est d'essayer en listant les fichiers du session.save_path tout en jouant avec les session_start().
ripat

Eléphanteau du PHP | 18 Messages

25 juil. 2005, 09:04

Merci Cerber,
Cela, ça marche, je l'avais déjà essayer mais c'est refaire ce qui existe déjà.
Merci aussi à Raptor et Ripat, je vais investiguer sur base de vos renseignements. Voici mon phpinfo() actuel:
  • session.auto_start Off Off
    session.bug_compat_42 On On
    session.bug_compat_warn On On
    session.cache_expire 180 180
    session.cache_limiter nocache nocache
    session.cookie_domain no value no value
    session.cookie_lifetime 0 0
    session.cookie_path / /
    session.cookie_secure Off Off
    session.entropy_file no value no value
    session.entropy_length 0 0
    session.gc_divisor 100 100
    session.gc_maxlifetime 60 60
    session.gc_probability 1 1
    session.hash_bits_per_character 4 4
    session.hash_function 0 0
    session.name PHPSESSID PHPSESSID
    session.referer_check no value no value
    session.save_handler files files
    session.save_path no value no value
    session.serialize_handler php php
    session.use_cookies On On
    session.use_only_cookies Off Off
    session.use_trans_sid 0 0
Merci à tous, je vous mettrai au courant du résultat de mes tests

Eléphanteau du PHP | 18 Messages

25 juil. 2005, 09:25

Voici mon dernier test, j'ai mis les paramètres suivants dans mon php.ini

Code : Tout sélectionner

session.gc_maxlifetime = 60 session.gc_probability = 100 session.gc_divisor = 100
et voici ce que j'ai en début des mes pages:

Code : Tout sélectionner

session_start(); if(isset($_SESSION['ip_client']) && ($_SESSION['ip_client'] != $_SERVER['REMOTE_ADDR'])) { session_destroy(); // redirection on the index page session_start(); header('Location: index.php'); } $_SESSION['ip_client'] = $_SERVER['REMOTE_ADDR']; // save the current ip from client
Après plus de 60 secondes, si je fais un "refresh" de ma page, $_SESSION['ip_client'] ne drevrait plus exicter.
Et ma page se réactualise comme si je n'avais aucun test...
Je crois que je vai définitivement adopter la solution de Cerber sauf si qqun a encore une idée géniale
Merci à tous