Pergunta

Estou desenvolvendo um sistema de login baseado em PHP. Cada usuário tem uma identificação (um número) e uma senha, que é armazenado como um hash salgada.

Eu sou capaz de descobrir se um login é bem sucedida ou não, mas agora eu preciso para armazenar informações que em algum lugar (de modo que o usuário não está permanentemente desconectado).

No passado, eu joguei com $ _SESSION variáveis. No entanto, estes parecem ser excluído quando o usuário sai do navegador, o que é indesejável. Além disso, não pode "assumir" que o usuário não vai tentar enganar o sistema, por isso tem de ser seguro.

Então, aqui estão as minhas perguntas:

  1. Devo usar $_SESSION ou $_COOKIE? Quais são as principais vantagens de cada uma dessas abordagens?
  2. Como implementar uma caixa de seleção 'Lembrar-me'?
  3. Que informações devem ser armazenadas na variável de sessão / biscoito?

Note que há problemas de segurança de banco de dados estão sendo levados em consideração nesta questão particular.

No que diz respeito número 3, o que quero dizer exatamente é:

  • Devo armazenar o ID ea senha de hash do usuário no cookie / sessão, ou
  • Devo armazenar o ID e a senha não-hash do usuário no cookie / sessão, ou
  • Devo armazenar 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)?

Eu quero manter o meu site como seguro, mas eficiente e amigável quanto possível. Se uma abordagem baseada em SessionID é tomada, eu também gostaria de receber alguma explicação sobre como armazená-lo no banco de dados.

Agradecemos antecipadamente

EDIT: Eran do e respostas de Brian combinados parecem ser o que eu preciso. Infelizmente, só posso marcar um deles como aceite. Vou tentar ir em frente e implementar para ver qual deles foi mais útil.

Foi útil?

Solução

Quero reiterar o ponto de Eran não armazenar a senha de usuários ou mesmo um hash da senha em dados da sessão ou cookies.

Em geral, eu tenho implementado a funcionalidade lembra de mim em aplicações web usando Cookies. Um bom lugar para começar para obter informações sobre a construção de um sistema de login "seguro" persistente é este blogue postar no aquário . Uma resposta em profundidade já é coberto em outra Stack Overflow resposta .

Se você precisa ter garantir que o login é garantir que você tem que usar https. Isso ocorre porque os cookies ou sessões podem ser roubados se eles não são criptografados.

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

Outras dicas

Para obter informações sensíveis (ou seja, os resultados de autenticação) usa apenas as sessões. As sessões são armazenadas no servidor e são muito menos propensos a ser comprometida.

Quanto tempo de vida da sessão, o padrão é o tempo de vida da sessão do navegador - mas você pode controlar isso. Existem várias definições que afectam que:

session.gc_maxlifetime -. Efetivamente controla o tempo de vida da sessão

session.gc_probability e session.gc_divisor juntos determinam a frequência com sessão de coleta de lixo terá lugar.

E por último - session.cookie_lifetime controla o tempo de vida do cookie de sessão (o cookie que contém o ID da sessão para que ele não tem que ser tranmistted sobre o URL). Ele deve corresponder ao valor do session.gc_maxlifetime.

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

loja da ID em $ _SESSION mas não armazenar o hash ou a senha não-hash. Depois que o usuário logado e o ID é guardado no $ _SESSION, você não precisa a senha mais.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top