Comment unique, c'est l'id de session php

Quel est le caractère unique de l'id de session php? J'ai eu l'impression à partir de diverses choses que j'ai lu que je ne devrais pas compter sur deux utilisateurs n'ayant jamais le même sessionid. N'est-il pas un GUID?

87
demandé sur Jalov 2008-09-26 14:41:50

8 réponses

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

cela ne vaut pas la peine de s'en préoccuper à moins que vous vous attendiez à construire un site web très achalandé ou un service pour le secteur bancaire.

34
répondu e-satis 2008-10-04 12:57:47

ce n'est pas très unique. 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 un peu d'entropie de / dev / urandom, comme

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

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

modifié pour ajouter: Il y a un DFA générateur de nombres aléatoires ensemencées par le pid, mélangé avec le temps dans usecs. Ce n'est pas une condition d'unicité ferme surtout du point de vue de la sécurité . Utilisez la configuration entropy ci-dessus.

mise à jour:

à partir de la session PHP 5.4.0.entropy_file par défaut à /dev / urandom ou /dev/arandom si elle est disponible. Dans PHP 5.3.0 cette directive est laissée vide par défaut. manuel PHP

61
répondu djsadinoff 2014-02-07 10:59:14

vous pouvez installer une fonction alternative de génération de hachage si vous voulez personnaliser la façon dont L'ID est généré (c'est un nombre de 128bit 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 aussi à d'autres articles sur la fixation de session et le détournement.

11
répondu Paul Dixon 2011-11-13 16:46:19

si vous voulez savoir comment PHP génère un ID de session par défaut, consultez le code source sur Github . Il 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 Congruence Linéaire Générateur - un pseudo générateur de nombres aléatoires (PRNG)
  4. source aléatoire spécifique à L'OS - si L'OS dispose d'une source aléatoire disponible (par exemple /dev/urandom)

si L'OS dispose d'une source aléatoire, alors la force de L'ID généré dans le but d'être un ID de session est élevée ( /dev/urandom et d'autres sources aléatoires OS sont (habituellement) cryptographiquement sécurisées PRNGs ). Si toutefois il n'est pas alors il est satisfaisant.

le but avec la génération d'identification de session est de:

  1. minimiser la probabilité de générer des deux Identifiants de session avec la même valeur
  2. rendent très difficile, sur le plan informatique, la génération de touches aléatoires et la frappe d'un en cours d'utilisation .

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

Vous ne peut absolument pas garantir l'unicité , mais les probabilités sont très faibles du fait de frapper de la même hachage à deux reprises que c'est, en général, pas la peine de s'inquiéter au sujet de.

11
répondu GordyD 2014-12-04 15:45:59

Taille de session_id

Supposons que seesion_id est distribué uniformément et a une taille=128 bits. Supposons que chaque personne sur la planète se connecte une fois par jour avec une 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 

donc la probabilité d'une ou plusieurs collisions est inférieure à une sur 70 milliards. Par conséquent, la taille a 128 bits de session_id devrait être assez grande. Comme mentionné dans d'autres commentaires, l' session_manager peut aussi vérifier que new 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 une bonne pseudo-aléatoire. Sur ce point, vous ne pouvez jamais en être sûr, mais je recommande d'utiliser une solution standard bien connue et fréquemment utilisée à cet effet (comme vous le faites probablement déjà).

, même si des collisions sont évitées en raison: la vérification, le caractère aléatoire et la taille de session_id est important, de sorte que les pirates ne peuvent pas, d'une manière ou d'une autre, faire des suppositions qualifiées et trouver active session_id:s avec une grande probabilité.

5
répondu MrJ 2012-06-13 22:42:42

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

Le détournement de session problème que les gens sont inquiets, c'est quand quelqu'un découvre l'id de session d'un utilisateur actif. Cela peut être évité de nombreuses façons, pour plus d'informations sur ce que vous pouvez voir cette page sur php.net and this paper on session fixation

3
répondu Ólafur Waage 2008-09-26 10:53:13

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

2
répondu gizmo 2008-09-26 10:50:50
<?php
session_start();
$_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 = '".$_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 session

0
répondu Arun Sharma 2018-07-23 08:48:23