src/config/helmet.ts
Versão: 1.0
Última atualização: 26 de agosto de 2025
Responsável: Ariel Spencer & Fabrício Bahiense
📋 Descrição
O que faz?
Configura middlewares de segurança HTTP usando Helmet para proteger a aplicação contra vulnerabilidades comuns e implementa rate limiting para prevenir abuso de requisições.
Por que existe?
Adiciona camadas essenciais de segurança à API, protegendo contra ataques XSS, clickjacking, sniffing de MIME type e limitando a taxa de requisições por IP para prevenir spam e ataques DDoS básicos.
Como funciona?
Exporta configuração do Helmet com headers de segurança personalizados e um limitador de taxa que permite máximo 60 requisições por minuto por IP, retornando erro 429 quando excedido.
🔧 Documentação Técnica
Arquitetura
Cliente → Rate Limiter → Helmet Security Headers → Aplicação
↓ > ↓
(60 req/min/IP) (Security Headers aplicados)
Tecnologias Utilizadas
- Segurança: Helmet.js
- Rate Limiting: express-rate-limit
- Framework: Express.js middleware
- Runtime: Node.js com TypeScript
Estrutura de Pastas
backend/ # Projeto
└── src/ # Source
└── config/ # Configurações
└── helmet.ts # Configuração de segurança
Configuração
Configuração do Helmet
contentSecurityPolicy: false // CSP desabilitado (flexibilidade)
xssFilter: true // Proteção XSS ativada
noSniff: true // Previne MIME sniffing
hidePoweredBy: true // Remove header X-Powered-By
frameguard: { action: 'deny' } // Bloqueia iframes (anti-clickjacking)
Configuração do Rate Limiter
windowMs: 1 * 60 * 1000 // Janela de 1 minuto
max: 60 // Máximo 60 requisições por janela
message: 'Too many requests...' // Mensagem de erro
Como usar
import { helmetConfig, limiter } from'./config/helmet'
import express from 'express'
const app = express()
// Aplicar rate limiting
app.use(limiter)
// Aplicar headers de segurança
app.use(helmetConfig())
📦 Dependências
Dependências Principais
|
Pacote |
Versão |
Finalidade |
|
helmet |
^7.1.0 |
Headers de segurança HTTP |
|
express-rate-limit |
^6.0.0 |
Controle de taxa de requisições |
Headers de Segurança Aplicados
|
Header |
Valor/Ação |
Proteção |
|
X-XSS-Protection |
1; mode=block |
Cross-Site Scripting |
|
X-Content-Type-Options |
nosniff |
MIME type sniffing |
|
X-Frame-Options |
DENY |
Clickjacking |
|
X-Powered-By |
(removido) |
Information disclosure |
🛡️ Configurações de Segurança
Rate Limiting
- Janela: 1 minuto por IP
- Limite: 60 requisições máximo
- Comportamento: HTTP 429 (Too Many Requests) quando excedido
- Reset: Automático a cada minuto
Helmet Security Headers
- CSP: Desabilitado para flexibilidade (considerar habilitar em produção)
- XSS Protection: Habilitado
- MIME Sniffing: Bloqueado
- Frame Options: Negado (previne embedding)
- Powered-By: Oculto
🧪 Testando a Configuração
Teste de Rate Limiting
# Testar limite de requisições
for i in {1..65};
do curl -I http://localhost:3001/api;
done
# Esperado: Primeiras 60 retornam 200, próximas retornam 429
Verificar Headers de Segurança
curl -I http://localhost:3001/api
# Verificar presença de:
# X-XSS-Protection: 1;
mode=block
# X-Content-Type-Options: nosniff
# X-Frame-Options: DENY
# (ausência de X-Powered-By)
🐛 Troubleshooting
Problemas Comuns
Rate Limit muito restritivo
Sintomas: Usuários legítimos recebem erro 429
Causa: Limite de 60 req/min muito baixo
Solução: Ajustar max e windowMs
CSP bloqueando recursos
Sintomas: Conteúdo não carrega no frontend
Causa: Content Security Policy muito restritivo
Solução: CSP já está desabilitado, mas validar
configuração
Headers não aparecendo
Sintomas: Headers de segurança ausentes
Causa: helmetConfig() não aplicado corretamente
Solução: Verificar se middleware está sendo usado antes das
rotas
⚠️ Considerações de Segurança
Recomendações para Produção
- Habilitar CSP: Validar configuração de Content Security Policy
- Ajustar Rate Limits: Baseado no uso dos usuários reais
- Monitoramento: Acompanhar tentativas de rate limit excedido
- Headers Adicionais: Considerar HSTS, Referrer Policy
Rate Limiting Avançado
// Configuração mais robusta para produção
const limiter = rateLimit({
windowMs:
15 * 60 * 1000, // 15 minutos
max:
1000, // 1000 requests por 15min
skipSuccessfulRequests:
true, // Não contar responses 2xx
keyGenerator:
(req) => req.ip, // Personalizar chave
})
📚 Referências e Links Úteis
Última revisão: 26 de agosto de 2025 por Ariel Spencer & Fabrício Bahiense