Question

Quelle est l'originalité de l'identifiant de session php? Plusieurs choses que j’ai lues me donnent l’impression 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?

Était-ce utile?

La solution

Session_id peut effectivement être dupliqué, mais la probabilité est très faible. Si vous avez un site Web avec un trafic passable, cela peut se produire une fois dans la vie de votre site Web et ennuyer un utilisateur pendant une session.

Cela ne vaut pas la peine de s’inquiéter si vous ne souhaitez pas créer un site Web à très fort trafic ou un service destiné au secteur bancaire.

Autres conseils

Ce n’est pas vraiment unique tel qu’expédié. Dans la configuration par défaut, c'est le résultat d'un hachage de différentes choses, y compris le résultat de gettimeofday (qui n'est pas vraiment unique), mais si vous êtes inquiet, vous devriez le configurer pour tirer quelque 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 de l'algorithme réel ils utilisent.

Édité pour ajouter: Il existe un générateur de nombres aléatoires DFA généré par le pid, mélangé au temps en usecs. Ce n'est pas une condition de l'unicité ferme en particulier 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 par défaut est / dev / urandom ou   / dev / arandom s'il est disponible. En PHP 5.3.0 cette directive est laissée   vide par défaut. Manuel PHP

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):

  1. adresse IP du client
  2. Heure actuelle
  3. Générateur de congruence linéaire PHP - 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 disponible (par exemple, / dev / urandom)

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 des PRNG sécurisés de manière cryptographique ). Si toutefois ce n'est pas le cas, c'est satisfaisant.

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

  1. minimisez la probabilité de générer deux identifiants de session avec la même valeur
  2. il est très difficile en termes de calcul de générer des clés aléatoires et d’en frapper un en cours d’utilisation .

Ceci est réalisé grâce à l'approche de PHP pour la génération de session.

Vous ne pouvez absolument pas garantir l'unicité , mais les probabilités de frapper deux fois le même hash sont tellement faibles que, d'une manière générale, il ne faut pas s'en inquiéter.

Vous pouvez installer une autre fonction de génération de hachage si vous souhaitez personnaliser la manière dont l'ID est généré (il s'agit d'un numéro 128 bits généré par défaut via MD5). Voir http://www.php.net/ manual / fr / 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 contient également des liens vers d’autres articles sur la réparation et le détournement de session.

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 

La probabilité d’une ou plusieurs collisions est donc inférieure à une sur 70 000 milliards. Par conséquent, la taille de session_id de 128 bits devrait être suffisante. Comme mentionné dans d'autres commentaires, le gestionnaire de session peut également vérifier que le nouvel identificateur de session n'existe pas déjà.

Aléatoire
Par conséquent, la grande question à mon avis est de savoir si les session_id: s sont générés avec un bon pseudo-aléatoire. Vous ne pouvez jamais en être sûr, mais je vous 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 du fait de la vérification, le caractère aléatoire et la taille de session_id sont importants, de sorte que les pirates informatiques ne peuvent pas, en quelque sorte, qualifier les suppositions et trouver une session_id: s active avec une grande probabilité.

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 du piratage de session qui inquiète les gens, c’est lorsque quelqu'un découvre l'identifiant de session d'un utilisateur actif. Cela peut être évité de nombreuses façons. Pour plus d'informations, vous pouvez consulter cette page. sur php.net et cet article sur la fixation de session

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

<?php
session_start();
<*>

si votre nom d'utilisateur est différent ou unique, vous pouvez utiliser ce code pour la session

SESSION['username']="username"; ?> <!DOCTYPE html> <html> <head> <title>Update</title> </head> <body> <table border="2"> <tr> <th>Username</th> <th>Email</th> <th>Edit</th> </tr> <?php $conn=mysqli_connect("localhost","root","","telephasic"); $q2="select * from register where username = '".<*>

si votre nom d'utilisateur est différent ou unique, vous pouvez utiliser ce code pour la session

SESSION['username']."'"; $run=mysqli_query($conn, $q2); while($row=mysqli_fetch_array($run)) { $name=$row[1]; $email=$row[2]; ?> <tr> <td><?php echo $name; ?></td> <td><?php echo $email; ?></td> <td><a href="edit.php"> Edit </a></td> </tr> <?php } ?> </table> </body>

si votre nom d'utilisateur est différent ou unique, vous pouvez utiliser ce code pour la session

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top