Pergunta

Estou pensando em implementar o clássico caixa de seleção 'lembrar de mim' no meu webapp para permitir que o usuário autenticado seja 'lembrado' quando ele retornar para visitar meu site.

Gmail, Facebook e outros têm esse tipo de recurso, mas não tenho certeza de quão seguro ele pode ser.

Um framework Java como Segurança Primavera usa uma 'abordagem de token baseada em hash'.O token gerado (usando nome de usuário, senha, expirationTime e uma privateKey) é armazenado nos Cookies do Cliente 'token=567whatever567'.O token é então reutilizado para autenticar novamente o usuário na próxima vez que ele retornar.

Estou preocupado com o fato de que, mesmo que o processo de login tenha ocorrido em uma conexão https, em cada solicitação http subsequente, o cookie será enviado sem criptografia na rede.

Basicamente todo mundo pode ler o token e reutilizá-lo para autenticar.

Estou tentando ver como o Gmail ou o Facebook estão implementando essa funcionalidade.Posso ver alguns cookies como 'presence=DJ267619445G09H0L15228675.....' no FB, outros no Gmail.
Não tenho muita certeza se eles usam algum outro truque para se proteger contra alguém que tenta se passar por outro usuário.

Vou tentar me personificar usando algo como ondulação para ver se eles estão usando apenas um token específico para lembrar o usuário.
Se estiverem, parece-me um grande problema de segurança.Talvez não o Facebook (não me importo com isso), mas com o Gmail, se você não definir 'Use sempre https' uma conexão http será usada e enviará seus tokens não criptografados pela Internet.
O que você acha?

Também notei que os campos de nome de usuário/senha do Facebook são expostos em http (não em https).Nesse sentido também estou me perguntando:Todos os sites que expõem o campo de nome de usuário/senha em http são inseguros 'por natureza'?Depois que a solicitação é enviada por http, não há 'redirecionamento para https' que possa corrigir o problema de 'credenciais visíveis para o mundo'.

Obrigado

Editar:
Minhas preocupações eram bem fundamentadas http://codebutler.com/
Graças ao Ovelha de fogo criadores por destacar o problema!!!

Foi útil?

Solução

Não é um problema implementar um lembrete-me. O que você precisa fazer é manter a sessão viva por muito tempo (e definir o cookie para durar muito). Até o Gmail o registrará após um determinado período (acho que são duas semanas ou um mês). No entanto, você precisa perceber que manter a mesma sessão em aberto aumenta mais a possibilidade de seqüestrar nela. Como contramedida, você precisa aumentar a força do seu identificador de sessão. O identificador de sessão é o que está no cookie (ou no URI, como comumente visto em algum software como "file.php? Phpssessid = 1234 ...").

A chave é manter um forte identificador de sessão. Por exemplo, no Gmail, você tem um biscoito GX com um valor semelhante a

DQAAAJoAAAA8mnjaAwgkS7y8Ws5MYCl-PAQLp9ZpMXpGKR47z4L9mlBH-4qEyApAtFbnLkzv1pPqxua1hOWMGiKYpBZr-h7Icyb-NUUg2ZW_nUFIymvw9KjmjSECYTowbCsDerkAxCzSDa83b5YC1mykPv1a9ji4znt6Fsna-AKgNTntvmUxeJ92ctsSlg9iGySEmXnisVyyJiQvI8jzbZqSpE_N2RKZ

A razão pela qual sequestrar a sessão é praticamente impossível é, porque o identificador de sessão é muito forte e porque o site utiliza HTTPs em todos os lugares. Ninguém pode adivinhar ou obter seu identificador de sessão (assim não pode seqüestrar em sua sessão). Em uma rápida olhada, o identificador de sessão acima parece ter um pouco de ~ 1250 bits de força, 1*10^376 Possibilidades diferentes. Ninguém pode adivinhar isso.

Obviamente, sempre haverá maneiras potenciais de ainda sequestrar a sessão. Por exemplo, as vulnerabilidades do XSS abrem o caminho para obter seus cookies e, portanto, o identificador de sessão, mas essa não é a falha de suas sessões de forma alguma e não tem nada a ver com um "lembre-me".

Estou preocupado com o fato de que, mesmo que o processo de login tenha acontecido sob uma conexão HTTPS, em todas as solicitações HTTP subsequentes, o cookie será enviado sem criptografia na rede.

Se você definir o sinalizador seguro do cookie como true enquanto estiver em https, o cookie nunca será enviado ao acessar o site via HTTP. É necessário fazer para sites somente para HTTPS.

Em geral, as pessoas parecem usar apenas HTTPs para a página de login, o que está errado. Se alguém realmente se importa, ele deve usar HTTPs em toda a página. Caso contrário, é impossível impedir todas as tentativas de seqüestro de sessão.

Por que muitos ainda usam HTTPs apenas para a parte de login? Provavelmente porque eles não percebem o que está nas apostas, ou porque é muito pesado da CPU para usar HTTPs em todos os lugares. No entanto, ainda é melhor usar o HTTPS para o log-in do que não usá-lo em qualquer lugar-porque ele criptografa as credenciais (portanto, apenas o identificador de sessão pode ser roubado posteriormente, não as credenciais reais durante o log-on).

Talvez não o Facebook (eu não ligo para isso), mas com o Gmail se você não definir 'Use sempre https', uma conexão HTTP será usada e enviará seus tokens não criptografados pela Internet. O que você acha?

Eu acho que o valor deve padrão para HTTPS em todos os casos, se possível. A única razão real de por que não usar o HTTPS é dinheiro (= desempenho/hardware).

Outras dicas

Geralmente é chamado de ataque de repetição. O invasor repete uma solicitação usando as mesmas credenciais (por exemplo, cookie) que roubou de você e é capaz de personificá -lo. O ataque XSS é apenas uma variação disso, mas é evitável (por exemplo, usando httponly).

A única maneira de mitigar a maioria dos ataques de reprodução é o HTTPS em todos os lugares. Isso deve manter longe a maioria dos olhos indiscretos.

Muitas técnicas de prevenção também.

Também existem dispositivos de hardware que fazem um trabalho melhor do que você pode invadir o software, diminuindo o servidor no processo, e você provavelmente entenderá errado. O hardware especializado pode fazer um trabalho muito melhor de rastrear solicitações em tempo real e determinar que o mesmo token está sendo usado por muitos IPs diferentes ao mesmo tempo, e mais rápido que um único operador humano deve ser capaz de solicitar.

No ASP.NET 2.0+, ao usar a autenticação de formulários, você pode especificar requireSSL='true' para indicar que os navegadores devem enviar apenas o cookie de autenticação quando uma conexão HTTPS for feita. Ver Este artigo do MSDN Para obter mais informações sobre como garantir a autenticação de formulários.


A única razão para não permitir remember me é se você é um aplicativo bancário ou semelhante. Se você não estiver, basta seguir algumas regras simples:

  1. Se você tem remember me, Faça uma expiração no cookie no máximo 30 dias no futuro e não deslize o valor. Forçar o usuário a fazer login uma vez por mês não é tão ruim.
  2. Quaisquer operações sensíveis exigir uma senha. Ao atualizar o faturamento, cartões de crédito ou detalhes da conta sempre re-request a senha dos usuários. A forma mais provável de abuso é tipicamente pelo mesmo computador que a pessoa está usando, mas também garante que mesmo um cookie de autenticação roubado por si só não possa causar muito mal. Você pode ver meu equilíbrio, mas não pode transferir nada.

Concordo com a maioria dos comentários feitos acima. Se você está preocupado com a segurança, você deve -

a) Use https por toda parte. Até o Gmail mudou recentemente para usar HTTPS por padrão - ver http://gmailblog.blogspot.com/2010/01/default-https-access-for-gmail.html

b) Defina o sinalizador seguro em seu cookie de sessão para impedir que o navegador o envie por uma conexão HTTP.

c) Corrija XSS em seu aplicativo. Se você tiver problemas com XSS, sua implementação de 'Remember Me' sempre será insuficiente. Veja Owasp XSS Prevention Cheat Sheet.

A inclusão de endereço IP no identificador de sessão não vai ajudar. Fazer isso fará com que a funcionalidade 'lembre -me de mim' praticamente e não acrescenta muita segurança. Eu sei com certeza que o Google não coloca endereços IP em seu identificador de sessão.

A única maneira de tornar o site totalmente seguro é habilitar o https em qualquer lugar.Você está certo, os cookies podem ser cheirados e posteriormente usados ​​para se passar por algo.

Existem algumas maneiras de Prevendo o seqüestro de sessão, como armazenar o endereço IP do cliente que abriu a sessão. Dados adicionais devem ser armazenados no lado do servidor para verificar sessões, mesmo sem um recurso de login automático. É melhor usar um nonce Para o token (ou pelo menos, baseie-o em dados não secretos) em vez do nome de usuário e senha de hash, como um invasor poderia montar um ataque para encontrar as informações de autenticação, dado o valor de hash.

Se você observar a fonte do Facebook, Gmail e provavelmente os formulários de login de outros sites, a ação do formulário de login usa HTTPS, que então redireciona para uma página que não é segura quando o login for bem-sucedido.

1/ Quando o usuário verifique "Lembre -me de mim": você armazena um hash de todas as informações sobre o computador dele: IP, navegador, sistema operacional, idioma etc ... e escreve este hash em seus cookies com seu id 2/ quando o usuário é De volta, você calcula o novo hash dele. Você compara esse valor com o valor no cookie recebido e o valor no banco de dados (para o ID fornecido). Se todos forem iguais, você pode autenticar o usuário.

Está claro ?

HTTPS não poderia fazer nada se você tiver um ataque XSS (melhor maneira de roubar biscoitos)

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