web-dev-qa-db-fra.com

L'identifiant de session php est-il unique

Dans quelle mesure l'ID de session php est-il unique? J'ai eu l'impression à partir de diverses choses que j'ai lu que je ne devrais pas compter sur deux utilisateurs n'obtenant jamais le même identifiant de session. N'est-ce pas un GUID?

89
Jalov

Session_id peut en effet être dupliqué, mais la probabilité est très faible. Si vous avez un site Web avec un trafic équitable, cela peut se produire une fois dans la vie de votre site Web et ne fera qu'ennuyer un utilisateur pour une session.

Cela ne vaut pas la peine d'être pris en compte, sauf si vous prévoyez de créer un site Web à très fort trafic ou un service pour le secteur bancaire.

37
e-satis

Ce n'est pas très unique comme expédié. Dans la configuration par défaut, c'est le résultat d'un hachage de diverses choses, y compris le résultat de gettimeofday (qui n'est pas terriblement unique), mais si vous êtes inquiet, vous devez le configurer pour dessiner une entropie de/dev/urandom, comme ça

ini_set("session.entropy_file", "/dev/urandom");
ini_set("session.entropy_length", "512");

recherchez "php_session_create_id" dans le code pour l'algorithme réel qu'ils utilisent.

Modifié pour ajouter: il existe un générateur de nombres aléatoires DFA prédéfini par le pid, mélangé avec le temps en usecs. Ce n'est pas une condition d'unicité ferme surtout du point de vue de la sécurité . Utilisez la configuration d'entropie ci-dessus.

Mise à jour:

À partir de PHP 5.4.0 session.entropy_file utilise par défaut/dev/urandom ou/dev/arandom s'il est disponible. Dans PHP 5.3.0 cette directive est laissé vide par défaut. PHP Manual

66
djsadinoff

Si vous voulez savoir comment PHP génère un ID de session par défaut, consultez le code source sur Github . Ce n'est certainement pas aléatoire et est basé sur un hachage (par défaut : md5) de ces ingrédients (voir ligne 310 de l'extrait de code):

  1. Adresse IP du client
  2. Heure actuelle
  3. PHP Linear Congruence Generator - un générateur de nombres pseudo aléatoires (PRNG)
  4. Source aléatoire spécifique au système d'exploitation - si le système d'exploitation dispose d'une source aléatoire (par exemple/dev/urandom)

Si le système d'exploitation dispose d'une source aléatoire, la force de l'ID généré dans le but d'être un ID de session est élevée (/dev/urandom et les autres sources aléatoires du système d'exploitation sont (généralement) des PRNG sécurisés cryptographiquement ). Si ce n'est pas le cas, alors c'est satisfaisant.

L'objectif de la génération d'identification de session est de:

  1. minimisez la probabilité de générer deux ID de session avec la même valeur
  2. rendre très difficile le calcul pour générer des clés aléatoires et en frapper une en cours d'utilisation.

Ceci est réalisé par l'approche de PHP à la génération de session.

Vous ne pouvez absolument pas garantir l'unicité , mais les probabilités sont si faibles de frapper deux fois le même hachage que cela ne vaut généralement pas la peine de s'inquiéter.

12
GordyD

Vous pouvez installer une autre fonction de génération de hachage si vous souhaitez personnaliser la façon dont l'ID est généré (c'est un numéro 128 bits généré via MD5 par défaut). Voir http://www.php.net/manual/en/session.configuration.php#ini.session.hash-function

Pour plus d'informations sur les sessions PHP sessions, essayez cet excellent article http://shiflett.org/articles/the-truth-about-sessions qui renvoie également à d'autres articles sur la fixation de session et Hijack.

11
Paul Dixon

Taille de session_id
Supposons que seeion_id est uniformément distribué et a une taille = 128 bits. Supposons que chaque personne sur la planète se connecte une fois par jour avec une nouvelle session persistante pendant 1000 ans.

num_sesion_ids  = 1000*365.25 *7*10**9 < 2**36
collission_prob < 1 - (1-1/2**82)**(2**36)  ≈ 1 - e**-(1/2**46) 
                ≈ 1/2**46 

Ainsi, la probabilité d'une ou plusieurs collisions est inférieure à un sur 70 000 milliards. Par conséquent, la taille de 128 bits du session_id devrait être suffisamment grande. Comme mentionné dans d'autres commentaires, le session_manager peut également vérifier que le nouveau session_id n'existe pas déjà.

Randomness
Par conséquent, la grande question que je pense est de savoir si les session_id: s sont générés avec un bon pseudo-aléatoire. Sur cela, vous ne pouvez jamais être sûr, mais je recommanderais d'utiliser une solution standard bien connue et fréquemment utilisée à cet effet (comme vous le faites probablement déjà).

Même si les collisions sont évitées en raison de la vérification, le caractère aléatoire et la taille de session_id sont importants, afin que les pirates ne puissent pas, en quelque sorte faire des suppositions qualifiées et trouver des session_id: s actifs avec une grande probabilité.

5
MrJ

Je n'ai pas trouvé de confirmation à ce sujet mais je crois que php vérifie si un identifiant de session existe déjà avant d'en créer un avec cet identifiant.

Le problème de détournement de session qui inquiète les gens, c'est quand quelqu'un découvre l'ID de session d'un utilisateur actif. Cela peut être évité de plusieurs façons, pour plus d'informations à ce sujet, vous pouvez voir cette page sur php.net et ce document sur la fixation de session

3
Ólafur Waage

Non, l'ID de session n'est pas un GUID, mais deux utilisateurs ne doivent pas obtenir le même ID de session car ils sont stockés côté serveur.

2
gizmo