Dans quelle mesure l'identifiant de session php est-il unique? J'ai eu l'impression d'après diverses choses que j'ai lues que je ne devrais pas compter sur deux utilisateurs qui n'obtiennent jamais le même identifiant de session. N'est-ce pas un GUID?
90
Ce n'est pas très unique tel qu'il est 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 tirer une certaine entropie de / dev / urandom, comme ceci
recherchez "php_session_create_id" dans le code de l'algorithme 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, en particulier du point de vue de la sécurité . Utilisez la configuration d'entropie ci-dessus.
Mettre à jour:
la source
Si vous voulez savoir comment PHP génère un identifiant 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 la ligne 310 de l'extrait de code):
Si le système d'exploitation a une source aléatoire disponible, 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 par cryptographie ). Si toutefois ce n'est pas le cas, c'est satisfaisant.
L'objectif de la génération d'identification de session est de:
Ceci est réalisé par l'approche PHP de la génération de session.
Vous ne pouvez pas absolument garantir l'unicité , mais les probabilités de frapper deux fois le même hachage sont si faibles que cela ne vaut généralement pas la peine de s'inquiéter.
la source
Vous pouvez installer une fonction alternative de génération de hachage si vous souhaitez personnaliser la façon dont l'ID est généré (c'est un nombre de 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, essayez cet excellent article http://shiflett.org/articles/the-truth-about-sessions qui renvoie également à d'autres articles sur la fixation de session et le détournement.
la source
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.
Ainsi, la probabilité d'une ou de plusieurs collisions est inférieure à une sur 70 000 milliards. Par conséquent, la taille de 128 bits de 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à.
Aléatoire
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 à cette fin (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, de sorte que les pirates ne peuvent pas, d'une manière ou d'une autre, faire des suppositions qualifiées et trouver des session_id: s actifs avec une grande probabilité.
la source
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 piratage de session qui inquiète les gens est celui où quelqu'un découvre l'identifiant de session d'un utilisateur actif. Cela peut être évité de plusieurs façons, pour plus d'informations, vous pouvez voir cette page sur php.net et cet article sur la fixation de session
la source
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.
la source
si votre nom d'utilisateur est différent ou unique, vous pouvez utiliser ce code pour la session
la source