Como proteger as senhas dos usuários? Má gestão de senhas #CommunityWeek
- #PHP
- #SQL
- #MySQL
O tratamento de senhas é uma das coisas mais importantes que devemos considerar ao criar a nossa aplicação, porém é compreensível que muitos Devs enfrentem problemas nesse assunto, e sempre deixem algo passar, pois criar um bom sistema de autenticação é uma tarefa extremamente desafiadora e uma das mais complicadas de implementar em nosso sistema.
Mas não se preocupe que esse artigo vai ajudar com o necessário que você precisa saber para proteger as senhas dos seus usuários. Vamos lá!
Principais fatores que devemos considerar ao criar um sistema de autenticação
1 - Exigir que o usuário cumpra algumas regras necessárias ao criar uma senha
Algumas exigências são necessárias para encorajar o usuário à criar senhas menos previsíveis, assim como:
- No mínimo 8 caracteres
- Pelo menos 1 Letra maiúscula
- Pelo menos 1 Letra minúscula
- Pelo menos 1 Número
- Pelo menos 1 caractere especial (@!#$&*)
2 - Mensagens de erro para o usuário
Existem algumas formas de dificultar o trabalho de um hacker em seu sistema, e uma delas é não mostrar informações que possam o ajudar, assim como:
> Manter apenas uma mensagem de erro na tela de login.
O hacker pode facilmente descobrir se um usuário existe ou não caso sua página de login tenha múltiplas mensagens de erro, como por exemplo:
Em nosso banco de dados temos o usuário "teste123" cadastrado com a senha "123", o hacker percebeu que seu sistema tem múltiplas mensagens de erro na tela de login, então ele começou a testar inúmeros usuários diferentes para saber se eles existem ou não, como no exemplo abaixo:
Ao se deparar com a mensagem "Usuário não existe" o hacker nem se dará o trabalho de tentar descobrir a senha dele, então vai para o próximo.
Agora o hacker sabe que existe um usuário chamado teste123 e irá tentar de tudo para descobrir sua senha, por isso a melhor forma de retornar mensagens de erro é utilizando apenas uma única mensagem genérica.
Agora você acabou de dificultar o trabalho do hacker, pois dessa forma ele não tem a informação se o usuário existe ou não.
Para isso funcionar, também é necessário que tudo no HTTP response seja idêntico em qualquer tipo de falha ao realizar o login. E também que a sua aplicação não realize nenhum contato com os cookies a não ser que o login e a senha estejam corretos.
Outra coisa também é implementar um sistema para bloquear a tentativa de login após X falhas.
> Mensagem da tela de esqueci/redefinir senha
Caso o usuário digite um e-mail que não esteja vinculado a nenhuma conta do nosso banco de dados, evite passar essa informação, pois assim o hacker estará explorando, como falamos no tópico anterior.
Ao invés disso, retorne apenas uma mensagem direta como "Ok! Verifique sua caixa de entrada.".
Não envie nada para o e-mail do usuário caso o e-mail não exista.
E envie algo caso o e-mail exista.
Assim sua aplicação ficará mais segura! Ah, e lembrem de dar um tempo de expiração para o link de redefinir senha, isso é de extrema importância.
> Tela de cadastro
Na tela de cadastro as coisas ficam mais diferentes, pois é impossível não informar ao usuário que o e-mail/usuário que ele tentou escolher já está sendo usado.
Então, a melhor forma que temos para evitar alguns problemas como esse na tela de cadastro é adicionando um captcha.
3 - Armazenamento de senhas no banco de dados
Esse é um assunto mais complexo, porém tem alguns pontos que você precisa saber.
> NUNCA!!! Armazene senhas sem criptografia (texto normal)
A melhor forma de armazenar senhas é utilizando um One Way Hash, que resumidamente é uma função matemática que gera uma criptografia do input que não tem como voltar ao input original.
Isso irá proteger seus usuários até mesmo se o banco de dados for hackeado. Escolha uma criptografia forte como o Bcrypt.
> Tenha um bom gerenciamento de sessões
- Lembre de implementar session timeouts, que consiste em destruir a sessão do usuário após um tempo X de inatividade.
- Nunca passe o SessionId através de métodos GET ou POST
- Gere novamente o ID da sessão na autenticação, um exemplo em php:
session_regenerate_id(true)
- Aceitar apenas IDs de sessão gerados pelo servidor
- Implemente uma função de logout forte
- Use o gerenciamento de sessão integrado, que consiste em gerar um Id de sessão aleatório forte, com tamanho suficiente para não ser adivinhada.
- Proteja seus cookies!! Existem frameworks que identificam se seus cookies foram manipulados ou não, qualquer suspeita de que seus cookies foram manipulados, encerre e invalide imediatamente a sessão.
> HTTPS
Verifique se seu site utiliza HTTPS, isso fará com se seus cookies fiquem seguros e evitará que as senhas sejam roubadas.
4- Encerramento / Conclusão
É Imprescindível o cuidado que devemos ter com as senhas dos nossos usuários, uma má gestão de senhas e dados pode ser FATAL para qualquer tipo de aplicação. Por isso sempre busque boas práticas para dificultar a vida de um hacker e sempre criptografe suas senhas e implemente bons sistemas de sessões!
Uma observação fora do tópico é que esse artigo foi criado com o objetivo de participar do desafio da #CommunityWeek que está acontecendo, vão dar uma olhada!
Então se puderem me ajudar deixando um "UPVOTE/LIKE", ficarei extremamente feliz de trazer mais conteúdo sobre vulnerabilidades e como proteger seu sistema delas.
É isso, espero que tenham gostado :).