2009-11-11 3 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 인 경우 자동 증가 필드를 사용할 수 있습니다. –

+0

정확히 그가 무엇을했는지에 달려 있지만 그래, 나는 동의한다. 'md5'에 대한 좋은 지적입니다. – deceze

1

매우 안전 해 보입니다. 그러나 유일하고 독특한 ID를 제공하는 것이 아닌가? 그리고 왜 MD5 해시를하고 있습니까? 그게 문제의 전체 범위를 소개합니다 ...

+0

php.net/uniqid는 이렇게하는 것을 권장합니다. ID를 데이터베이스와 쿠키에 저장하여 누군가가 누군가의 계정을 도용하기 위해 악의적으로 도용 된 쿠키를 사용하려고하는지 확인할 수 있습니다. – TheMagician

+0

'uniqid' 스레드에 대한 첫 번째 주석을보십시오 : http://php.net/manual/en/function.uniqid.php#91126 :) IMHO md5 해시 형식으로 문자열이 필요한 경우에만 괜찮습니다. (문자 또는 길이 제한). – deceze

관련 문제