Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2954 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Cookies de sessions (résolu avec session_set_save_handler)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Cookies de sessions (résolu avec session_set_save_handler)

n°257463
Hansolo
Posté le 29-11-2002 à 22:23:20  profilanswer
 

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
mood
Publicité
Posté le 29-11-2002 à 22:23:20  profilanswer
 

n°257467
Mara's dad
Yes I can !
Posté le 29-11-2002 à 22:27:14  profilanswer
 

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é.
n°257655
Hansolo
Posté le 30-11-2002 à 09:30:22  profilanswer
 

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

n°257717
Mara's dad
Yes I can !
Posté le 30-11-2002 à 13:41:05  profilanswer
 

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é.
n°257814
Hansolo
Posté le 30-11-2002 à 16:42:33  profilanswer
 

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+

n°258040
Mara's dad
Yes I can !
Posté le 30-11-2002 à 23:35:13  profilanswer
 

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é.
n°258553
Hansolo
Posté le 01-12-2002 à 23:55:31  profilanswer
 

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+

n°258644
Mara's dad
Yes I can !
Posté le 02-12-2002 à 09:28:54  profilanswer
 

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é.
n°258673
Hansolo
Posté le 02-12-2002 à 09:53:05  profilanswer
 

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+

n°258690
Mara's dad
Yes I can !
Posté le 02-12-2002 à 10:08:32  profilanswer
 

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é.
mood
Publicité
Posté le 02-12-2002 à 10:08:32  profilanswer
 

n°258706
Hansolo
Posté le 02-12-2002 à 10:22:04  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Cookies de sessions (résolu avec session_set_save_handler)

 

Sujets relatifs
Prob preg_match() - résoluFormatage date sous ORACLE et PHP [Resolu avec TO_CHAR]
[XHTML] Equivalent de <script type="text/javascript"> [Résolu]PHP + JS c koi le probleme?? [RESOLU]
Integrer une page HTML dans une autre ? [RESOLU][SDL] blitting d'apres un masque (résolu)
[JS] Gestion des cookiesFaire descendre automatiquement une scrollbar... [resolu]
Erreur 500 lors du chargement d'une image [Résolu]Connaitre le volume de données reçues et envoyées d'une session
Plus de sujets relatifs à : Cookies de sessions (résolu avec session_set_save_handler)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR