Uma apresentação interativa mostrando vulnerabilidades e soluções em segurança de APIs.
Falhas de configuração de segurança em sistemas ou APIs que permitem:
- Acesso não autenticado a dados sensíveis
- Exposição de informações do servidor
- Falta de controle de acesso
- Operações críticas sem proteção
npm installApós iniciar cada API, abra no navegador:
- API vulnerável:
http://localhost:3000/docs - API corrigida:
http://localhost:3001/docs
Na API corrigida:
- Execute
POST /login - Copie o
tokenretornado - Clique em Authorize no Swagger e cole:
Bearer SEU_TOKEN - Teste os endpoints protegidos
npm startnode simular-ataque.jsO que acontece:
- Consegue acessar
/api/userssem autenticação - Visualiza dados sensíveis (salários, e-mail etc.)
- Consegue deletar usuários sem permissão
- Expõe credenciais do banco de dados
Resultado: todos os ataques são bem-sucedidos.
npm run start:corrigidanode simular-ataque-corrigida.jsO que acontece:
- Tenta acessar
/api/userssem token -> negado - Faz login em
/login-> recebe token JWT - Acessa
/api/userscom token -> permitido - Tenta deletar sem permissão -> bloqueado
- Dados sensíveis não são expostos -> protegido
Resultado: os ataques são bloqueados.
curl http://localhost:3000/api/usersResultado:
{
"sucesso": true,
"mensagem": "Dados de usuários (sem autenticação!)",
"usuarios": [
{
"id": 1,
"nome": "João Silva",
"email": "joao@empresa.com",
"salario": 5000
},
{
"id": 2,
"nome": "Maria Santos",
"email": "maria@empresa.com",
"salario": 6000
}
]
}curl http://localhost:3000/api/statusResultado:
{
"servidor": "Em produção",
"debug": true,
"banco_dados": "postgresql://admin:senha123@db.interna.com",
"chave_secreta": "chave_super_secreta_123456"
}curl http://localhost:3001/api/usersResultado:
{
"erro": "Acesso negado! Token não fornecido.",
"mensagem": "Faça login primeiro para obter um token."
}curl -X POST http://localhost:3001/loginResultado:
{
"mensagem": "Login realizado com sucesso!",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}curl -H "Authorization: Bearer SEU_TOKEN_AQUI" http://localhost:3001/api/usersResultado:
{
"sucesso": true,
"autenticado_como": "admin@empresa.com",
"usuarios": [ ... ]
}curl -H "Authorization: Bearer SEU_TOKEN_AQUI" http://localhost:3001/api/statusResultado:
{
"servidor": "Em produção",
"versao": "1.0.0 (SEGURA)",
"debug": false,
"mensagem": "Informações sensíveis não são expostas!"
}- API sem autenticação expõe dados de usuários
- Qualquer pessoa consegue acessar informações sensíveis
- Operações críticas (delete) sem proteção
- Credenciais e chaves secretas visíveis
- Roubo de dados pessoais
- Vazamento de credenciais
- Exclusão e modificação de dados
- Comprometimento da aplicação inteira
- Autenticação com JWT
- Autorização por roles (admin, user)
- Ocultamento de informações sensíveis
- Proteção de endpoints críticos
- Todos os ataques são bloqueados
- Apenas usuários autenticados acessam dados
- Operações críticas requerem autorização
- Informações sensíveis são protegidas
.
├── app-vulneravel.js # API sem segurança
├── app-corrigida.js # API com segurança JWT
├── simular-ataque.js # Simula ataques na versão vulnerável
├── simular-ataque-corrigida.js # Testa segurança da versão corrigida
├── package.json # Dependências
└── README.md # Este arquivo
- Introdução: 2 minutos
- Demonstração vulnerável: 1 minuto (
simular-ataque.js) - Explicação do problema: 2 minutos
- Demonstração corrigida: 1 minuto (
simular-ataque-corrigida.js) - Conclusão: 1 minuto
- Total: ~7 minutos
- Use 2 terminais lado a lado (API + ataque)
- Maximize os textos para visualização
- Pause nos pontos importantes
- Pergunte à plateia: "Como vocês acham que um atacante conseguiria acesso?"
- Mostre os dados expostos
- Explique o impacto em dados reais (salários, informações pessoais)
- Mostre a comparação antes vs depois
- Reforce que a implementação de autenticação é essencial
- Mencione que JWT é apenas uma solução (também há OAuth, sessão etc.)
- Falta de autenticação
- Falta de controle de acesso
- Exposição de informações sensíveis
- Debug habilitado em produção
- O que é e como funciona
- Estrutura: Header.Payload.Signature
- Token contém informações do usuário
- Protege contra acesso não autorizado
- Implementar autenticação
- Validar e autorizar cada requisição
- Nunca expor segredos (credenciais, chaves)
- Desabilitar debug em produção
- Usar HTTPS em produção
- Manter tokens com expiração
Você pode modificar os arquivos para experimentar:
- Adicione mais endpoints vulneráveis
- Exponha diferentes tipos de dados sensíveis
- Teste sem CORS (remova a linha
app.use(cors()))
- Adicione diferentes roles (admin, user, viewer)
- Teste autorização em endpoints específicos
- Valide token expirado
- Por que é perigoso expor dados de usuários?
- Como um atacante exploraria isso em produção?
- Por que autenticação não é suficiente?
- O que é diferente entre autenticação e autorização?
- Como as credenciais do banco de dados poderiam ser usadas?
Para adicionar mais cenários ou melhorar a demonstração, edite os arquivos .js.
Bom sucesso na apresentação.