Может ли эта рекурсивная функция сойти с ума? - PullRequest
0 голосов
/ 11 ноября 2009
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() );
    }
}

Безопасна ли эта функция или в ней есть недостатки? Его единственная цель - генерировать уникальный идентификатор для каждого сеанса.

Ответы [ 2 ]

1 голос
/ 11 ноября 2009

Вы не возвращаете значение рекурсивной функции, поэтому, если функция вызывается рекурсивно, вы не получите никакого значения обратно. Вам нужно сделать:

return generate_session_id( $db );

Тебе здесь вообще не нужна рекурсия. Просто сделайте нормальный цикл:

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

Кроме того, вам действительно нужно сгенерировать идентификатор самостоятельно? Используете ли вы какую-то обработку сеанса, которая требует этого?

1 голос
/ 11 ноября 2009

выглядит довольно безопасно. Но разве смысл uniqid в том, что он предоставляет уникальный идентификатор? И почему вы делаете хэш MD5 на нем? Это создает целый ряд проблем ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...