Autenticação e sessões
Como os usuários provam quem são e como você os mantém conectados sem entregar as chaves a um atacante. Esta é a superfície mais atacada de qualquer aplicação.
Checklist
- Faça hash de senhas com um algoritmo lento e com salt. Use bcrypt, scrypt ou Argon2, nunca SHA ou MD5 simples, e nunca armazene texto puro. Se você consegue ler a senha de um usuário, um atacante com acesso ao seu banco de dados também consegue.
- Limite tentativas de login e de redefinição. Restrinja as tentativas por IP e por conta (por exemplo, dez a cada quinze minutos), depois retorne 429. Sem isso, a força bruta é trivial.
- Não revele quais e-mails existem. Login, cadastro e redefinição de senha devem retornar a mesma resposta genérica, exista ou não a conta, com tempo de resposta e códigos de status consistentes.
- Torne os tokens de redefinição e verificação de curta duração e de uso único. Uma hora ou menos, invalidados após o uso. Trate-os como senhas.
- Vincule o fluxo OAuth ao navegador que o iniciou. Se você fizer login com Google, GitHub ou similar, armazene um valor
stateem um cookie na requisição inicial e compare-o no callback. Sem esse vínculo, um atacante pode enviar à vítima um link que a conecta na conta do atacante (login-CSRF). Veja APIs e requisições. - Valide a resposta do provedor de identidade. Exija um e-mail verificado, confira o audience e o issuer do token, e nunca confie em um id fornecido pelo cliente.
- Se oferecer autenticação multifator, proteja o segundo fator atrás do primeiro. O segundo fator só deve ser acessível depois que a verificação de senha passar, com um desafio de uso único; caso contrário, o espaço de códigos pode ser alvo de força bruta por si só.
- Expire as sessões e permita revogação. Defina um tempo de vida de token adequado e faça com que a troca de senha invalide todas as sessões existentes.
- Verifique a senha contra listas de senhas vazadas (por exemplo, a API de k-anonymity do HIBP) no cadastro e na redefinição.
Como testar
- Faça cinquenta tentativas de login erradas e confirme que você é limitado.
- Compare a resposta para um e-mail real e para um falso na redefinição. Elas devem ser idênticas.
- Inicie um login OAuth em um navegador e conclua em outro. Deve falhar.