Sistema de login PHP usando Cookies e Hashes Salgados

Estou desenvolvendo um sistema de login baseado em PHP. Cada usuário possui uma ID (um número) e uma senha, que é armazenada como um hash salgado.

Posso descobrir se um login é bem sucedido ou não, mas agora preciso armazenar essa informação em algum lugar (para que o usuário não seja caducado permanentemente).

No passado, joguei com as variables ​​$ _SESSION. No entanto, estes parecem ser excluídos quando o usuário sai do navegador, o que não é desejado. Além disso, não posso “assumir” que o usuário não tente enganar o sistema, por isso tem que ser seguro.

Então, aqui estão as minhas questões:

  1. Devo usar $_SESSION ou $_COOKIE ? Quais são as principais vantagens de cada uma dessas abordagens?
  2. Como implementar uma checkbox de seleção ‘Lembrar?’?
  3. Qual informação deve ser armazenada na variável session / cookie?

Observe que nenhum problema de segurança do database está sendo tomado em consideração nesta questão particular.

Em relação ao número 3, o que quero dizer exatamente é:

  • Devo guardar a ID e a senha hashed do usuário no cookie / session, ou
  • Devo guardar a ID e a senha não esquecida do usuário no cookie / session, ou
  • Devo guardar um “SessionID” e a senha (hash ou não hash?) Ou
  • Devo armazenar um “SessionID”, o “ID” e a senha (mais uma vez, hash ou não hash)?

Quero manter meu site seguro, mas eficiente e fácil de usar quanto possível. Se uma abordagem baseada em SessionID for tomada, eu também apreciaria alguma explicação sobre como armazená-la no database.

Agradeço antecipadamente

EDITAR: as respostas de Eran e Brian combinadas parecem ser o que eu preciso. Infelizmente, só posso marcar um deles conforme aceito. Vou tentar seguir em frente e implementar para ver qual deles foi mais útil.

Quero reiterar o ponto de Eran nunca armazene a senha dos usuários ou mesmo um hash da senha em session ou dados de cookies.

Em geral, implementei a funcionalidade de me lembrar em aplicativos da Web usando Cookies. Um bom lugar para começar a obter informações sobre a construção de um sistema de login persistente “seguro” é esta publicação no blog na aquecedor . Uma resposta aprofundada já está coberta por outra resposta de estouro de pilha .

Se você precisa ter certeza de que o login é seguro, você deve usar https. Isso ocorre porque cookies ou sessões podem ser roubadas se não estiverem criptografadas.

Outra boa prática a seguir é o sistema de login de 2 níveis. Você pode ver isso em sites como a Amazon, onde você pode adicionar coisas ao seu carrinho sem fazer login, mas se você deseja fazer o check-out ou editar sua conta de alguma forma, você deve inserir sua senha novamente.

Para informações confidenciais (ou seja, resultados de autenticação), use apenas sessões. As sessões são armazenadas no lado do servidor e são muito menos prováveis ​​de serem comprometidas.

Em relação à duração da session, o padrão é a duração da session do navegador – mas você pode controlar isso. Existem várias configurações que afetam isso:

session.gc_maxlifetime – efetivamente controla a vida útil da session.

session.gc_probability e session.gc_divisor juntos determinam a frequência da garbage collection da session.

E o último – session.cookie_lifetime controla a vida útil do cookie da session (o cookie que contém o ID da session, portanto, não precisa ser transferido para o URL). Ele deve corresponder ao valor da session.gc_maxlifetime.

Além disso, nunca armazene senhas em sessões ou cookies (mesmo em formato hash). Apenas os resultados da autenticação.

Armazene a ID em $ _SESSION, mas não armazene a senha hash ou não hash. Uma vez que o usuário tenha logado e o ID é salvo em $ _SESSION, você não precisa mais da senha.