Quão único é o id de sessão php? Tenho a impressão de várias coisas que li que não devo confiar que dois usuários nunca obtenham o mesmo ID de sessão. Não é um GUID?
90
Session_id pode realmente ser duplicado, mas a probabilidade é muito baixa. Se você tem um site com um tráfego razoável, isso pode acontecer uma vez na vida do seu site e irá incomodar apenas um usuário por uma sessão.
Não vale a pena se preocupar com isso, a menos que você pretenda construir um site de tráfego muito alto ou um serviço para o setor bancário.
Não é muito original quando enviado. Na configuração padrão é o resultado de um hash de várias coisas, incluindo o resultado de gettimeofday (que não é terrivelmente único), mas se você estiver preocupado, deve configurá-lo para extrair alguma entropia de / dev / urandom, assim
procure por "php_session_create_id" no código do algoritmo real que eles estão usando.
Editado para adicionar: há um gerador de número aleatório DFA propagado pelo pid, misturado com o tempo em usecs. Não é uma condição de exclusividade firme, especialmente do ponto de vista da segurança . Use a configuração de entropia acima.
Atualizar:
fonte
Se você quiser saber como o PHP gera um ID de sessão por padrão, verifique o código-fonte no Github . Certamente não é aleatório e é baseado em um hash (padrão: md5) desses ingredientes (consulte a linha 310 do snippet de código):
Se o sistema operacional tiver uma fonte aleatória disponível, a força do ID gerado com o propósito de ser um ID de sessão é alta ( / dev / urandom e outras fontes aleatórias do sistema operacional são (geralmente) PRNGs criptograficamente seguros ). Se, no entanto, não o fizer, então é satisfatório.
O objetivo com a geração de identificação de sessão é:
Isso é alcançado pela abordagem do PHP para geração de sessão.
Você não pode garantir absolutamente a exclusividade , mas as probabilidades são tão baixas de acertar o mesmo hash duas vezes que, em geral, não vale a pena se preocupar.
fonte
Você pode instalar uma função de geração de hash alternativa se quiser personalizar a forma como o ID é gerado (é um número de 128 bits gerado via MD5 por padrão). Veja http://www.php.net/manual/en/session.configuration.php#ini.session.hash-function
Para obter mais informações sobre sessões de PHP, experimente este excelente artigo http://shiflett.org/articles/the-truth-about-sessions que também possui links para outros artigos sobre fixação de sessão e hijack.
fonte
Tamanho de session_id
Suponha que seeion_id seja uniformemente distribuído e tenha tamanho = 128 bits. Suponha que cada pessoa no planeta efetue login uma vez por dia com uma sessão persistente por 1000 anos.
Portanto, a probabilidade de uma ou mais colisões é menor que uma em 70 mil bilhões. Portanto, o tamanho de 128 bits de session_id deve ser grande o suficiente. Conforme mencionado em outros comentários, o session_manager também pode verificar se o novo session_id ainda não existe.
Aleatoriedade
Portanto, a grande questão que penso é se os session_id: s são gerados com boa pseudo aleatoriedade. Você nunca pode ter certeza disso, mas eu recomendaria usar uma solução padrão bem conhecida e frequentemente usada para esse propósito (como você provavelmente já faz).
Mesmo que as colisões sejam evitadas devido à verificação, a aleatoriedade e o tamanho do session_id são importantes, para que os hackers não possam, de alguma forma, fazer uma suposição qualificada e encontrar session_id: s ativos com grande probabilidade.
fonte
Não encontrei uma confirmação sobre isso, mas acredito que o php verifica se já existe um id de sessão antes de criar um com esse id.
O problema de sequestro de sessão com o qual as pessoas estão preocupadas é quando alguém descobre a id de sessão de um usuário ativo. Isso pode ser evitado de várias maneiras, para mais informações você pode ver esta página em php.net e este artigo sobre fixação de sessão
fonte
Não, a id de sessão não é um GUID, mas dois usuários não devem obter a mesma id de sessão que estão armazenados no lado do servidor.
fonte
se o seu nome de usuário for diferente ou único, você pode usar este código para a sessão
fonte