Page 1 sur 1
Expiration des sessions
Posté : 20 juil. 2005, 08:59
par DomiPi
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 !).
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
Posté : 20 juil. 2005, 10:36
par cerber
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"
Posté : 20 juil. 2005, 11:42
par DomiPi
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
Posté : 20 juil. 2005, 12:41
par raptor
les sessions sont gérées par fichier ou par cookie ?
Colle tes infos du phpinfo() pour la partie session
Posté : 20 juil. 2005, 13:18
par cerber
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 ()
Posté : 20 juil. 2005, 13:37
par cerber
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();
Posté : 20 juil. 2005, 16:52
par Ripat
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().
Posté : 25 juil. 2005, 09:04
par DomiPi
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
Posté : 25 juil. 2005, 09:25
par DomiPi
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