Quando e por que devo usar session_regenerate_id ()?

95

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?

rvandoni
fonte
porque após o início da sessão o is é criado e na outra página quando você inicia a sessão as variáveis ​​estão presentes: -
HaRsH
@HaRsH Oo? Session_regenerate_id remove o ID de sessão antigo e cria um novo para evitar o sequestro da sessão com XSS, por exemplo. Isso não afeta a visibilidade das variáveis ​​SESSION em outros documentos.
Xatenev
sim, eu sei que não tenho efeito sobre outra variável, mas se você não iniciar a sessão nessa página, a variável não está presente nessa página no núcleo do php
HaRsH
1
Mas isso é sobre session_regenerate_id, não sobre session_start ...
Xatenev
1
Sugiro ler o RFC onde foi proposto: wiki.php.net/rfc/precise_session_management
jankal

Respostas:

96

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:

Amal Murali
fonte
2
E o que acrescenta se o hacker fizer a 20ª chamada? O ID da sessão foi alterado e ele é o único proprietário da sessão;))
fred727
@ fred727 Se o hacker tiver sorte o suficiente para atingir a 20ª ligação, o usuário terá um id inválido e não será mais autenticado. Sem qualquer regeneração, tanto o hacker quanto o usuário seriam autenticados.
Bradmage
também pode ser útil chamar session_regenerate_id ao armazenar informações confidenciais nas sessões (não apenas nas transições de autenticação)
Adam
É possível corrigir a sessão se as informações da sessão não estiverem em um cookie? Estou armazenando as informações da sessão em arquivos no meu servidor, é necessário gerar novamente o id?
Gonzalo
"para fixar (definir) o ID de sessão (SID) de outro usuário" .... deve ser substituído por "para fixar (definir) um ID de sessão (SID) no computador de outro usuário e usá-lo depois de autenticado "
Contador م
25

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:

Guia de segurança de PHP: sessões

Fixação de sessão (boa leitura)

Dimag Kharab
fonte
22

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).

Machavity
fonte
2
HTTPS não muda nada na fixação.
Kelunik
4
Mas torna os ataques de detecção mais difíceis, o que poderia ser usado para obter o id da sessão em primeiro lugar.
demonkoryu
meu aplicativo php se desconecta em segundos, estou usando a regeneração, há um limite de arquivos de sessão que podem ser criados ou há um limite de ids regenerados que podem estar causando o logout?
sqlchild
Geralmente não. Você pode postar uma pergunta separada sobre isso
Machavity
16

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 httpOnlyflag para impedir o acesso por javascript). Vamos imaginar que o Stack Overflow tinha HTTPS sempre ativado e também o securesinalizador 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.

Kelunik
fonte
Mas até aquele momento em que o session_regenerate_id()emitido, Alice pode acessar a conta do bobs? Isso está certo?
Akam
2
@akam - Está tarde, mas vale a pena responder ... 1. Bob não faz logout, Alice pode usar seu login - 2. Bob faz logout, Alice não faz login, Alice pode usar seu ID de sessão, mas não há login ativo para acessar seus dados - 3. Bob efetua logout, Alice efetua login, Bob usa o ID da sessão, há um login ativo, Bob acessa os dados de Alice. Mas para ser específico: dependendo da segurança dos scripts, um ID de sessão não significa necessariamente que você pode acessar os dados de um usuário desconectado, mas geralmente é possível e de alto risco.
codekandis de
15

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.

Hasan Veli Soyalan
fonte
12

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.

Peter
fonte
4

session_regenerate_id (): Não é possível regenerar o id da sessão - a sessão não está ativa

if(session_status() == PHP_SESSION_ACTIVE)
{
    session_regenerate_id();
}
Anton
fonte