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。
答案 0 :(得分:1)
看起来很安全。但是,它不提供一个,呃,唯一的id?你为什么要在它上面做MD5哈希?这引入了一系列问题......
答案 1 :(得分:1)
你没有返回递归函数的值,所以如果以递归方式调用函数,你将得不到任何值。你需要这样做:
return generate_session_id( $db );
尽管如此,你根本不需要递归。只需做一个正常的循环:
do {
// generate id
$id_exists = // look if id exists
} while ($id_exists);
另外,你真的需要自己生成ID吗?您是否正在使用需要此处理的会话处理?