Aprenda / Segurança web

IntermediárioAula 12 de 1618 min0% da trilha

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.

o que realmente reduz a chance de força bruta
"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 lembrar

Isso 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.

Navegador
Servidor
Caixa de e-mail

Clique em “Reproduzir fluxo” para ver a requisição passo a passo.

o que o token de reset precisa garantir
- 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 solicitou

O 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?

Quiz rápido

Por que exigir maiúscula, número e símbolo obrigatórios protege menos do que parece, comparado a exigir um comprimento mínimo maior?
Por que um fluxo de redefinição de senha nunca deveria reenviar a senha atual por e-mail?