Cookies de sessions (résolu avec session_set_save_handler)

Cookies de sessions (résolu avec session_set_save_handler) - PHP - Programmation

Marsh Posté le 29-11-2002 à 22:23:20    

Salut,
 
Je ne sais pas si cette question a déjà été posée.
 
Mon problème : si un visiteur se connecte au site mais ne se déconnecte pas avec le lien prévu (appellant la fonction session_ destroy()), le cookie de session reste présent sur le serveur avec les données du visiteur (certes cryptées mais le fichier reste stocké quand même). A sa prochaine visite, un nouveau cookie est crée.
 
Y a t'il un moyen de supprimer les cookies de session que le visiteur n'a pas supprimé en se déconnectant correctement ?
 
Merci :).


Message édité par Hansolo le 01-12-2002 à 23:56:40
Reply

Marsh Posté le 29-11-2002 à 22:23:20   

Reply

Marsh Posté le 29-11-2002 à 22:27:14    

YES !
 
Lis la doc sur les sessions.
 
Y'a un truc qui du genre garbage collector.
 


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 30-11-2002 à 09:30:22    

J'ai lu la doc sur php.net, mais je n'ai rien vu :(.
 
Je vais rejetter un oeil. Merci ;).

Reply

Marsh Posté le 30-11-2002 à 13:41:05    

C'est là : http://www.php.net/manual/fr/ref.session.php
 
Regarde session.gc_maxlifetime et session.gc_probability
 
C'est des paramètres de php.ini.
 


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 30-11-2002 à 16:42:33    

Merci. J'avais en effet vu ces 2 paramètres après que tu m'ai parlé de "garbage collection".
 
Ce qui est embêtant, c'est que c'est dépendant de la configuration du serveur. Je vais essayé de trouvé autre chose, avec par exemple session_set_save_handler() qui permet les stockages des info de sessions dans une BD.
 
a+

Reply

Marsh Posté le 30-11-2002 à 23:35:13    

J'osai pas t'en parler !
 
C'est sûr que le mieux pour les session, c'est déviter les fichiers et d'utiliser une base. Ce qui implique de tout écrire sois-même. L'avantage, c'est que çà fait exactement ce que tu veux !
 
Bon courrage !  
 
En cherchant un peu, y'a moyen de trouver des exemples tout fait. (Si ce n'est pas déjà fait ?)


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 01-12-2002 à 23:55:31    

Je ne suis pas du genre à reprendre des exemples tout fait :).
 
Après quelques heures de débuggage, je viens de finir de mettre en place la gestion des sessions avec une BD MySQL. Voilà le code actuel mais je pense encore le modifier...
 

Code :
  1. <?php
  2. // On défini les fonctions de stockage et de chargement des sessions à partir
  3. // de la base de données
  4. function open()
  5. {
  6. return true;
  7. }
  8. function close()
  9. {
  10. return true;
  11. }
  12. function read($id)
  13. {
  14. global $mysql;
  15. $mysql->Requete("SELECT * FROM `sessions` WHERE `session_id` = '$id' AND `expiration` > '".time()."'" );
  16. $voir_session = $mysql->Resultat();
  17. if ($voir_session[variable])
  18. {
  19.  return $voir_session[variable];
  20. }
  21. else
  22. {
  23.  return "";
  24. }
  25. }
  26. function write($id, $variable)
  27. {
  28. global $mysql;
  29.  $mysql->Requete("SELECT * FROM `sessions` WHERE `session_id` = '$id'" );
  30.  $verifier_session = $mysql->Resultat();
  31.  if ($verifier_session[session_id])
  32.  {
  33.   $mysql->Requete("UPDATE `sessions` SET `variable` = '$variable' WHERE `session_id` = '$id' LIMIT 1" );
  34.  }
  35.  else
  36.  {
  37.   // On défini la durée maximale d'une session à 30 minutes
  38.   $mysql->Requete("INSERT INTO `sessions` (`session_id`, `expiration`) VALUES ('$id', '".(time() + 1800)."')" );
  39.  }
  40. return true;
  41. }
  42. function destroy($id)
  43. {
  44. global $mysql;
  45. $mysql->Requete("DELETE FROM `sessions` WHERE `session_id` = '$id'" );
  46. $mysql->Requete("OPTIMIZE TABLE `sessions`" );
  47. return true;
  48. }
  49. function gc($maxlifetime)
  50. {
  51. global $mysql;
  52. $mysql->Requete("DELETE FROM `sessions` WHERE `expiration` < '".(time() + $maxlifetime)."'" );
  53. $mysql->Requete("OPTIMIZE TABLE `sessions`" );
  54. return true;
  55. }
  56. session_set_save_handler("open", "close", "read", "write", "destroy", "gc" );
  57. session_start();
  58. ?>


 
La variable $mysql fait référence à une classe que j'ai écrit et qui prend en charge les échanges avec la BD MySQL (connexion, requête, etc...).
 
Je peux enfin définir le stockage et le recyclage des variables à ma guise ;).
 
a+

Reply

Marsh Posté le 02-12-2002 à 09:28:54    

Très bien !
 
Je suis comme toi, j'aime pas reprendre des trucs tout fait.
 
Remarques :
 
Durée maximale d'une session à 30 minutes. Tu peux utiliser le paramètre de php.ini 'session.gc_maxlifetime'.
 
Ce qui donne :  
$session_maxlifetime = ini_get( 'session.gc_maxlifetime' );
if( empty( $session_maxlifetime ) )
{
 $session_maxlifetime = 1800;
}
 
D'autre part dans write($id, $variable), $variable n'est utilisé qu'en cas d'update. Tu n'en n'a pas besoin en INSERT ?


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 02-12-2002 à 09:53:05    

En fait, la durée des sessions est définie de 2 manières :
 
- dans la fonction write : les variables de sessions ne sont plus écrites (màj) dans la BD au delà de 30 minutes.
 
- dans la fonction gc : le paramètre $maxlifetime correspond au paramètre session.gc_maxlifetime du fichier de configuration.
 

Mara's dad a écrit a écrit :

 
D'autre part dans write($id, $variable), $variable n'est utilisé qu'en cas d'update. Tu n'en n'a pas besoin en INSERT ?




 
Non.
 
Les fonction sont lues dans cet ordre : open, read, write, close (en boucle, je pense).
 
Lorsque la session est amorcée aucune variable de session existe, il n'a donc qu'a créer la session. Après un $_POST qui identifie l'utilisateur, les variables de session existent et sont écrites. Si l'identification échoue, la session est détruite.
 
a+

Reply

Marsh Posté le 02-12-2002 à 10:08:32    

Pour moi, la session commence avant l'identification de l'utilisateur !
 
1- L'utilisateur envoie une requête HTTP sans ID de session.
2- Coté serveur, le gestionnaire de session gènère un id de session au session_start(), et te permet déjà de mettre en session des infos, genre type de navigateur, adresse IP, date et heure de la première visite...
3- APRES avoir envoyé le résultat de ta page, le serveur enregistre les variables de session avec la fonction write, qui doit faire un insert la première fois.
 
Rmq : Pour des raison de sécurité, j'ai ajouté l'adresse IP comme clef de ma table session, en plus du session_id. Comme çà, il n'est pas possible (ou plus difficile en tout cas) d'usurper la session d'un visiteur.


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 02-12-2002 à 10:08:32   

Reply

Marsh Posté le 02-12-2002 à 10:22:04    

Je suis d'accord. La session commence aussi à l'affichage du formulaire d'identification, mais je n'envoye encore aucune variable (concernant l'utilisateur) à ce moment là (à part l'expiration).
 
C'est pour cela qu'à la première lecture (fonction read) la session existe mais ne renvoie pas de variable à la session write.
 
A la deuxième lecture (lorsque l'utilisateur s'identifie), des variables existent et mettent à jour la session (qui doit exister).
 
Avec un seul INSERT dans la fonction write, tu crée plusieurs fois la même session (sauf si comme toi on attribue une ID à la session avec l'IP par exemple).


Message édité par Hansolo le 02-12-2002 à 10:25:43
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed