2009-11-11 45 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()); 
    } 
} 

此功能是否安全使用或有任何缺陷?其唯一目的是爲每個會話生成唯一的ID。這個遞歸函數可以瘋狂嗎?

回答

1

你沒有返回遞歸函數的值,所以如果函數是遞歸調用的,你將不會返回任何值。你需要做的:

return generate_session_id($db); 

雖然你不需要遞歸。只是做一個正常的循環:

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

另外,你真的需要自己生成ID?你是否正在使用某些需要此操作的會話處理?

+0

此外,如果是MySQL,他可以使用自動增量字段。 – 2009-11-11 03:38:20

+0

取決於他究竟是什麼,但是,我同意。關於'md5'的好點也是如此。 – deceze 2009-11-11 03:40:47

1

看起來很安全。但是,它提供了一個呃唯一的ID是不是uniqid的要點?你爲什麼要在它上面做一個MD5散列?這引入了一系列的問題......

+0

php.net/uniqid建議這樣做。我會把ID放到數據庫和cookie中,這樣我就可以檢查是否有人試圖惡意使用被盜的cookie來劫持某人的賬戶。 – TheMagician 2009-11-11 03:42:54

+0

看看'uniqid'線程的第一條評論:http://php.net/manual/en/function.uniqid.php#91126 :)恕我直言,如果你需要一個格式爲md5 hash的字符串(字符或長度限制)。 – deceze 2009-11-11 03:46:28