Quão exclusivo é o ID da session do php

Quão exclusivo é o ID da session do PHP? Eu tive a impressão de várias coisas que eu li que eu não deveria confiar em dois usuários que nunca receberiam a mesma session. Não é um GUID?

Session_id pode de fato ser duplicado, mas a probabilidade é muito baixa. Se você tem um site com um tráfego justo, isso pode acontecer uma vez na vida do site e apenas irritará um usuário por uma session.

Isso não vale a pena se preocupar, a menos que você espera construir um site de tráfego muito alto ou um serviço para o setor bancário.

Não é muito original como enviado. Na configuração padrão, é o resultado de um hash de várias coisas, incluindo o resultado de gettimeofday (que não é extraordinariamente único), mas se você estiver preocupado, você deve configurá-lo para desenhar alguma entropia de / dev / urandom, assim

ini_set("session.entropy_file", "/dev/urandom"); ini_set("session.entropy_length", "512"); 

procure “php_session_create_id” no código para o algoritmo real que eles estão usando.

Editado para adicionar: há um gerador de números randoms DFA semeado pelo pid, misturado com o tempo em usecs. Não é uma condição de exclusividade firme, especialmente a partir de uma perspectiva de segurança . Use a configuração de entropia acima.

Atualizar:

A partir do PHP 5.4.0 session.entropy_file predefinições para / dev / urandom ou / dev / arandom se estiver disponível. No PHP 5.3.0, esta diretiva é deixada em branco por padrão. Manual do PHP

Você pode instalar uma function de geração de hash alternativa se desejar personalizar a forma como a ID é gerada (é um número de 128 bits gerado por MD5 por padrão). Consulte http://www.php.net/manual/en/session.configuration.php#ini.session.hash-function

Para obter mais informações sobre as sessões do PHP, experimente este excelente artigo http://shiflett.org/articles/the-truth-abouts-sessions que também vincula outros artigos sobre a fixação e o seqüestro de session.

Se você quiser saber como o PHP gera uma ID de session por padrão, verifique o código-fonte no Github . Certamente, não é random e é baseado em um hash (padrão: md5) desses ingredientes (veja a linha 310 do fragment de código):

  1. Endereço IP do cliente
  2. Hora atual
  3. Gerador de Congregação Linear PHP – um gerador de números pseudo randoms (PRNG)
  4. Origem aleatória específica do sistema operacional – se o sistema operacional tiver uma fonte aleatória disponível (por exemplo / dev / urandom)

Se o sistema operacional tiver uma fonte aleatória disponível, a força da ID gerada com o objective de ser um ID de session é alta ( / dev / urandom e outras fonts aleatórias do SO são (geralmente) PRNG criptográficamente seguras ). Se, no entanto, não é satisfatório.

O objective com geração de identificação de session é:

  1. minimize a probabilidade de gerar duas IDs de session com o mesmo valor
  2. torná-lo muito desafiador computacionalmente para gerar chaves aleatórias e atingir um em uso .

Isto é conseguido pela abordagem do PHP para a geração de session.

Você não pode absolutamente garantir a singularidade , mas as probabilidades são tão baixas de bater no mesmo hash duas vezes que é, em geral, não vale a pena se preocupar.

Tamanho do session_id
Suponha que seeion_id esteja uniformemente distribuído e tenha tamanho = 128 bits. Suponha que cada pessoa no planeta logue uma vez por dia com uma persistente e nova session por 1000 anos.

 num_sesion_ids = 1000*365.25 *7*10**9 < 2**36 collission_prob < 1 - (1-1/2**82)**(2**36) ≈ 1 - e**-(1/2**46) ≈ 1/2**46 

Portanto, a probabilidade de uma ou mais colisões é inferior a um em 70 mil bilhões. Portanto, um tamanho de 128 bits do session_id deve ser suficientemente grande. 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 o session_id: s é gerado com boa pseudo aleatoriedade. Sobre isso, você nunca pode ter certeza, mas eu recomendaria usar uma solução padrão bem conhecida e usada com freqüência para esse fim (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, de modo que os hackers não podem, de alguma forma, adivinhar e encontrar o active session_id: s com grande probabilidade.

Não encontrei uma confirmação sobre isso, mas acredito que o php verifique se já existe um ID de session antes de criar um com esse id.

O problema de seqüestro de session que as pessoas estão preocupadas é quando alguém descobre o ID da session de um usuário ativo. Isso pode ser evitado de várias maneiras, para obter mais informações sobre isso, você pode ver esta página no php.net e neste documento sobre a fixação da session

Não, id de session não é um GUID, mas dois usuários não devem obter o mesmo ID de session que estão armazenados no lado do servidor.

    Intereting Posts