Política de senha e um fluxo seguro de 'esqueci minha senha'
Exigir símbolo e maiúscula obrigatórios protege menos do que parece — e um reset de senha mal feito é uma porta de entrada por si só.
Duas coisas que parecem "só burocracia de formulário" — regra de senha e o fluxo de "esqueci minha senha" — são, na prática, superfície de ataque real. Uma política de senha mal pensada não protege ninguém de verdade; um fluxo de reset mal implementado pode virar um jeito de sequestrar a conta de outra pessoa sem nunca precisar adivinhar senha nenhuma.
Por que comprimento importa mais que exigir símbolo e maiúscula
A intuição comum é: exigir letra maiúscula, número e símbolo obrigatórios torna a senha mais forte. Na prática, isso costuma levar as pessoas a criar senhas como Senha123! — tecnicamente cumprindo toda regra, mas extremamente previsível, porque a maioria resolve a exigência sempre do mesmo jeito (maiúscula no início, número e símbolo no fim). O que realmente aumenta o espaço de possibilidades que um atacante precisaria testar é o comprimento: uma senha longa, mesmo só com letras minúsculas, tem exponencialmente mais combinações possíveis do que uma curta cheia de regras artificiais.
"Senha123!" → 9 caracteres, segue toda regra clássica, mas é um
padrão extremamente comum (previsível pra quem ataca)
"cavalo-batata-nuvem" → 20 caracteres, só letras minúsculas e hífen,
mas o espaço de combinações possíveis é
MUITO maior — e é mais fácil de lembrarIsso não significa "não exigir nada" — comprimento mínimo (14+ caracteres é uma recomendação comum hoje) e checar a senha contra uma lista de senhas vazadas/comuns conhecidas continuam sendo defesas úteis. O ponto é que regra de composição forçada (maiúscula+número+símbolo obrigatórios) tem efeito bem menor do que parece, e empurra o usuário a comportamentos previsíveis.
O fluxo correto de "esqueci minha senha"
A lição 6 já estabeleceu que não existe "recuperar" uma senha — ela nunca fica guardada de um jeito que permita isso. Um fluxo de reset correto não devolve a senha antiga; ele dá ao usuário um jeito de definir uma senha nova, provando antes que ele realmente tem acesso à conta.
Clique em “Reproduzir fluxo” para ver a requisição passo a passo.
- Aleatório e longo o suficiente pra não ser adivinhável
- De uso único — usado uma vez, é invalidado imediatamente
- Expiração curta (minutos, não dias) — reduz a janela de um link
de e-mail antigo sendo reaproveitado por alguém que não deveria
- Vinculado a UM usuário específico — não serve pra resetar
a senha de ninguém além de quem o solicitouO detalhe que mais separa um fluxo seguro de um vulnerável: o sistema nunca deveria reenviar a senha atual por e-mail, nem em texto puro nem de nenhuma forma — se um sistema faz isso, é sinal de que a senha está guardada de forma reversível, contrariando tudo que a lição 6 explicou sobre hashing.
Não revelar se um email existe na base
Um detalhe fácil de esquecer: a resposta de "esqueci minha senha" não deveria diferenciar visivelmente entre "email enviado" e "esse email não existe na nossa base" — mostrar essa segunda mensagem permite que qualquer um descubra, testando emails um por um, quais estão cadastrados no sistema (um problema chamado user enumeration). A resposta correta é sempre genérica: "se esse email existir na nossa base, um link de redefinição foi enviado" — verdadeira nos dois casos, sem vazar informação nenhuma.
Exercício
Um formulário de "esqueci minha senha" responde "Email enviado com sucesso!" quando o email existe, e "Este email não está cadastrado" quando não existe. Por que isso é um problema de segurança, mesmo sem nenhuma senha sendo exposta diretamente?