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?
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?
Respostas:
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.
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.
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:
Você deve usar o session_regenerate_id()
para interromper o sequestro e a fixação da sessão .
Desde esta resposta Security.SE :
O sequestro de sessão refere-se ao roubo do cookie da sessão. Isso pode ser feito mais facilmente ao compartilhar uma rede local com outros computadores. Por exemplo, na Starbucks. Exemplo ... um usuário com sessão Y está navegando no site de James no Starbucks. Estou ouvindo o tráfego de rede deles, tomando meu café com leite. Eu pego os cookies do usuário com a sessão Y para o site de James e configuro meu navegador para usá-los. Agora, quando eu acessar o site de James, o site de James.
A partir dessa página :
A fixação de sessão é uma técnica de ataque que força o ID de sessão de um usuário a um valor explícito. Dependendo da funcionalidade do site de destino, várias técnicas podem ser utilizadas para "consertar" o valor do ID da sessão. Essas técnicas variam de exploits de Cross-site Scripting a bombardear o site com solicitações HTTP feitas anteriormente. Depois que o ID de sessão de um usuário for corrigido, o invasor esperará que esse usuário faça o login. Depois que o usuário faz isso, o invasor usa o valor de ID de sessão predefinido para assumir a mesma identidade online.
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:
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 alguém obtivesse esta sessão, o que ganharia?
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).
session_regenerate_id
?Você deve usá-lo para evitar a fixação da sessão .
session_regenerate_id
?Sempre que o estado de autenticação muda, é principalmente no login e logout.
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 o secure
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.
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
session_start();
session_regenerate_id();
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.
Um caso de uso simples:
// User visits a webshop
$shopcart = new Cart();
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.
// User orders items
$shopcart->add('123', 20);
$shopcart->add('124', 18);
$shopcart->add('127', 5);
Para cada produto adicionado, um registro é feito em minha tabela de carrinho de compras. Também identificado pelo id da sessão.
// User saves cart in order to use it later
$shopcart->save();
O usuário decidiu salvar seu carrinho. Ele agora está sendo anexado ao seu ID de usuário.
// Regenerate session id for user to be able to make a new cart
session_regenerate_id();
O id da sessão é regenerado e o usuário pode agora começar a criar outro carrinho de compras.