2009-11-11 5 views
0
function generate_session_id(&$db) 
{ 
    $user_sess_id = md5(uniqid(mt_rand(), true); 

    try 
    { 
     $stmt = $db->prepare("SELECT COUNT(*) AS session_exists FROM sessions WHERE session_id = :session_id"); 
     $stmt->bindParam(':session_id', $user_sess_id); 
     $stmt->execute(); 
     $result = $stmt->fetch(PDO::FETCH_ASSOC); 

     if($result['session_exists'] == 1) 
     { 
      // Recursion ! 
      generate_session_id($db); 
     }  
     else 
     { 
      return $user_sess_id; 
     } 
    } 
    catch(PDOException $e) 
    { 
     die("generate_session_id(): " . $e->getMessage()); 
    } 
} 

Cette fonction est-elle sécuritaire à utiliser ou présente-t-elle des failles? Son seul but est de générer un identifiant unique pour chaque session.Cette fonction récursive peut-elle devenir folle?

Répondre

1

Vous ne renvoyez pas la valeur de la fonction récursive, donc si la fonction est invoquée récursivement, vous n'obtiendrez aucune valeur. Vous devez faire:

return generate_session_id($db); 

Vous n'avez pas besoin de récursion du tout ici. Faites simplement une boucle normale:

do { 
    // generate id 
    $id_exists = // look if id exists 
} while ($id_exists); 

De même, avez-vous vraiment besoin de générer vous-même l'ID? Utilisez-vous un traitement de session qui nécessite cela?

+0

En outre, s'il s'agit de MySQL, il pourrait utiliser un champ d'auto-incrémentation. –

+0

Cela dépend de ce qu'il veut exactement, mais oui, je suis d'accord. Bon point sur le 'md5' aussi bien. – deceze

1

Apparemment sans danger. Mais le but d'uniqid n'est-il pas de fournir un identifiant unique? Et pourquoi faites-vous un hachage MD5 dessus? Cela introduit toute une série de problèmes ...

+0

php.net/uniqid recommande de le faire de cette façon. Je vais mettre l'identifiant dans la base de données et dans le cookie afin que je puisse vérifier si quelqu'un essaie d'utiliser malicieusement un cookie volé pour pirater le compte de quelqu'un. – TheMagician

+0

Regardez le premier commentaire sur le thread 'uniqid': http://php.net/manual/fr/function.uniqid.php#91126 :) IMHO c'est seulement correct si vous avez besoin d'une chaîne au format d'un hachage md5 (caractère ou longueur limite). – deceze