Por que e quando devo usar a session_regenerate_id()
função em php? Devo sempre usá-lo depois de usar o session_start()
? Eu li que tenho que usá-lo para evitar a fixação de sessão, esse é o único motivo?
php
session
session-fixation
rvandoni
fonte
fonte
Respostas:
O que é
session_regenerate_id()
?Como o nome da função indica, é uma função que substituirá o ID da sessão atual por um novo e manterá as informações da sessão atual.
O que isso faz?
Ajuda principalmente a prevenir ataques de fixação de sessão. Ataques de fixação de sessão ocorrem quando um usuário mal-intencionado tenta explorar a vulnerabilidade em um sistema para fixar (definir) o ID de sessão (SID) de outro usuário. Ao fazer isso, eles obterão acesso completo como o usuário original e poderão realizar tarefas que, de outra forma, exigiriam autenticação.
Para evitar tais ataques, atribua ao usuário uma nova ID de sessão usando
session_regenerate_id()
quando ele entrar com sucesso (ou para cada X solicitações). Agora, apenas ele tem o ID de sessão, e seu ID de sessão antigo (fixo) não é mais válido.Quando devo usar
session_regenerate_id()
?Como o symbecean aponta nos comentários abaixo, o id da sessão deve ser alterado em qualquer transição no estado de autenticação e apenas nas transições de autenticação.
Leitura adicional:
fonte
Você deve usar o
session_regenerate_id()
para interromper o sequestro e a fixação da sessão .Desde esta resposta Security.SE :
A partir dessa página :
Quando usar
Quando o usuário está editando / atualizando algumas entradas importantes (alteração de senhas, credenciais, senhas esquecidas etc.) que podem comprometer a segurança do site ou a política de privacidade.
Veja também:
Guia de segurança de PHP: sessões
Fixação de sessão (boa leitura)
fonte
Acho que a questão do envenenamento por sessão foi muito bem abordada.
Para responder à pergunta "Quando devo usar isso?" parte, é importante dar um passo atrás e considerar o que seu aplicativo está fazendo com a sessão. Ou, dito de outra forma, esta é a principal pergunta de segurança que você precisa responder
Se tudo o que você fizer for rastrear dados anônimos (o usuário chega ao site e você os usa para rastrear suas visitas), então há poucos motivos para gerar uma sessão novamente. Um sequestrador não ganharia nada de valor agarrando essa sessão.
Muitos sites oferecem logins, no entanto. Um login muda muitas coisas. Eu posso acessar meu perfil. Posso alterar as configurações. Portanto, um sequestrador pode querer meu acesso à conta, especialmente se todos os usuários normais e administradores usam sessões para gerenciar o login. Então, quando as pessoas vêm ao meu site e fazem login, eu regenero a sessão. Isso adiciona uma camada extra de segurança de que meu usuário recém-conectado tem menos probabilidade de ser sequestrado.
Sempre que adicionarmos dados críticos a uma sessão, você deve considerar a regeneração do ID da sessão. Se você precisa proteger seu aplicativo contra a fixação, uma regeneração aleatória pode ser útil, mas eu NUNCA regeneraria a cada solicitação. Por padrão, o PHP armazena sessões em arquivos no disco local. Você está adicionando muita E / S de disco para mitigar o que é um vetor de ataque relativamente pequeno. Se você realmente precisa de mais segurança, eu recomendaria usar HTTPS completo em vez de regenerar regularmente (HTTPS torna a fixação muito difícil de realizar).
fonte
Por que devo usar
session_regenerate_id
?Você deve usá-lo para evitar a fixação da sessão .
Quando devo usar
session_regenerate_id
?Sempre que o estado de autenticação muda, é principalmente no login e logout.
Exemplo
Bob se senta em um computador público e, navegando em stackoverflow.com, ele abre uma nova sessão lá. O ID da sessão é salvo em um cookie (com
httpOnly
flag para impedir o acesso por javascript). Vamos imaginar que o Stack Overflow tinha HTTPS sempre ativado e também osecure
sinalizador definido para o cookie.Como podemos roubar a sessão agora?
Bob anota o ID da sessão. Ele sai do computador sem fechar o navegador. Agora Alice chega a este computador e vê que o Stack Overflow já está carregado. Ela faz login agora.
Agora estamos no estágio em que você deve usar
session_regenerate_id
. Se você não criar um novo ID de sessão aqui durante o login, Bob poderia usar a sessão anterior que ele havia anotado para acessar a sessão de Alice e estaria conectado como Alice agora.fonte
session_regenerate_id()
emitido, Alice pode acessar a conta do bobs? Isso está certo?Você pode usá-lo para melhor segurança.
Desta forma, você está criando id de sessão para uso único.
Digamos que seu ID de sessão de usuário seja = 3
Alguns hackers hackearam seu cliente e obtiveram seu session_id. Assim, o hacker pode usar esse cookie para usar sua sessão.
Se você tem um código como
você pode alterar a sessão sempre que usarem o seu site.
Agora o hacker obtém sessionid = 3
mas você mudou a sessão depois que ele a usou para que seu
usuário tem sessionid = 4 // auth
hacker tem sessão = 3 // null
Mas há um pequeno ponto, digamos que você esteja usando o método regenerate e seu cliente apenas faça o login no site e feche o navegador ou inativo. Seu cliente tem sessionid = 4 e se o hacker obtiver cookies nessa parte, eles terão o mesmo sessionid.
Conforme explicado acima, desta forma, você pode proteger seu cliente da detecção de dados de uma maneira, mas ainda assim não resolverá o problema para sempre.
Mas será muito mais seguro se você usar SSL enc.
Desculpe pelo inglês ruim.
fonte
Um caso de uso simples:
Uma sessão é iniciada e uma entrada é feita no banco de dados. O carrinho de compras do usuário é identificado por seu id de sessão.
Para cada produto adicionado, um registro é feito em minha tabela de carrinho de compras. Também identificado pelo id da sessão.
O usuário decidiu salvar seu carrinho. Ele agora está sendo anexado ao seu ID de usuário.
O id da sessão é regenerado e o usuário pode agora começar a criar outro carrinho de compras.
fonte
fonte