2009-02-07 7 views
11

Je me suis intéressé à la façon dont les sessions fonctionnent en interne, mais j'ai peu de connaissances de C (et je ne sais pas où chercher dans la source PHP pour cela).Est-ce que ma compréhension des sessions PHP est correcte?

Voilà ce que je comprends des séances au moment:

  1. Lorsque vous démarrez une session, l'utilisateur se voit attribuer un identifiant de session qui est stockée dans un cookie.
  2. Lorsque les données de session sont enregistrées (via $_SESSION), elles sont stockées sur le système de fichiers, avec l'identifiant de session correspondant et un délai d'expiration.

Est-ce correct? Quelle est la méthode dans laquelle les identifiants de session sont créés? Je suppose que c'est basé sur le temps mais que se passe-t-il si deux utilisateurs envoient une demande en même temps? Quelles méthodes sont en place en interne pour les empêcher d'obtenir le même identifiant?

Merci,

Répondre

27

Ma compréhension est du processus de gestion de session interne est la suivante:

Lorsque session_start est appelé, PHP est à la recherche d'un paramètre du client qui a été envoyé via POST, GET, ou dans un cookie (en fonction de la configuration, voir session.use_cookies, session.use_only_cookies et session.use_trans_sid) avec le nom de la valeur session.name pour utiliser l'ID de session d'une session déjà démarrée. S'il trouve un ID de session valide, il tente de récupérer les données de session du stockage (voir session.save_handler) pour charger les données dans $_SESSION. S'il ne trouve pas d'ID ou si son utilisation est interdite, PHP génère un nouvel ID à l'aide d'une fonction de hachage (voir session.hash_function) sur les données d'une source qui génère des données aléatoires (voir session.entropy_file).

À la fin de l'exécution ou lorsque session_write_close est appelée, les données de session dans $_SESSION sont stockées dans le stockage désigné.

1

L'ID de session est probablement juste une chaîne aléatoire de lettres et de chiffres. Aussi, il serait étrange que PHP ne vérifie pas si elle est unique et ne peut donc pas être la même pour deux utilisateurs. En ce qui concerne (1) et (2), je dirais que vous avez raison, mais je n'ai pas travaillé avec PHP récemment, alors n'hésitez pas à ne pas me croire.

15

Regardez php_session_create_id dans ext/session/session.c dans la source php

Il va comme ceci:

  • obtenir le temps de la journée
  • obtenir l'adresse IP à distance
  • construire une chaîne avec les secondes et microsecondes à partir de l'heure actuelle, avec l'adresse IP
  • nourrir dans configuré session hash function (soit MD5 ou SHA1)
  • si elle est configurée, nourrir quelque caractère aléatoire supplémentaire d'un entropy file
  • générer de la valeur de hachage finale

donc d'obtenir un double est assez difficile.Cependant, vous devriez vous familiariser avec le concept de la fixation de session, qui permet à un attaquant de choisir potentiellement le session_id que sa cible adoptera - voir Sessions and Cookies pour une bonne introduction.

Questions connexes