Em ambientes modernos de desenvolvimento, a segurança das aplicações web vai além de validar entradas e controlar sessões. Um aspecto frequentemente subestimado, mas crucial, é a correta configuração dos cabeçalhos HTTP de segurança. No ecossistema Node.js, a biblioteca Helmet fornece uma forma prática e robusta de aplicar esses cabeçalhos automaticamente em aplicações Express.
Neste artigo, vamos explorar em profundidade quais cabeçalhos de segurança o Helmet aplica por padrão, o que eles fazem, por que são importantes e como customizá-los para atender às necessidades específicas do seu sistema.
O que é o Helmet?
Helmet é um conjunto de middlewares de segurança para aplicações Express em Node.js. Seu objetivo é adicionar automaticamente cabeçalhos HTTP que ajudam a proteger sua aplicação contra ataques comuns, como clickjacking, cross-site scripting (XSS), ataques por content sniffing, entre outros.
Desde sua criação em 2012, Helmet tornou-se um padrão de fato para projetos Node.js preocupados com segurança, sendo amplamente utilizado e mantido pela comunidade.
Cabeçalhos de Segurança Aplicados pelo Helmet
1. X-DNS-Prefetch-Control
Controla se o navegador pode fazer pré-busca de nomes DNS. A pré-busca pode acelerar a navegação, mas também introduz riscos de vazamento de metadados.
- Valor padrão:
off - Configuração manual:
app.use(helmet.dnsPrefetchControl({ allow: false }))
2. X-Frame-Options
Protege contra ataques de clickjacking impedindo que seu site seja carregado em um <iframe> externo.
- Valor padrão:
SAMEORIGIN - Configuração manual:
app.use(helmet.frameguard({ action: 'sameorigin' }))
3. Strict-Transport-Security (HSTS)
Força o navegador a usar exclusivamente HTTPS para conexões futuras, evitando ataques man-in-the-middle.
- Valor padrão:
max-age=15552000; includeSubDomains - Configuração manual: javascriptCopiarEditar
app.use(helmet.hsts({ maxAge: 31536000, includeSubDomains: true, preload: true }))
4. X-Content-Type-Options
Impedem que o navegador tente adivinhar o tipo MIME de um recurso. Essa prática pode ser explorada para executar scripts maliciosos.
- Valor padrão:
nosniff - Configuração manual:
app.use(helmet.noSniff())
5. X-Permitted-Cross-Domain-Policies
Restringe o uso de políticas cross-domain para tecnologias legadas como Flash e PDF.
- Valor padrão:
none - Configuração manual:
app.use(helmet.permittedCrossDomainPolicies())
6. Referrer-Policy
Controla quais informações de referenciador (referrer) o navegador envia em requisições. Pode prevenir vazamento de URLs internas.
- Valor padrão:
no-referrer - Configuração manual:
app.use(helmet.referrerPolicy({ policy: 'no-referrer' }))
7. Cross-Origin-Resource-Policy (CORP)
Define se recursos (como imagens e fontes) podem ser compartilhados com outros sites.
- Valor padrão:
same-origin - Configuração manual:
app.use(helmet.crossOriginResourcePolicy({ policy: 'same-origin' }))
8. Cross-Origin-Opener-Policy (COOP)
Garante isolamento entre janelas e abas de navegadores, dificultando ataques de cross-origin com recursos compartilhados.
- Valor padrão:
same-origin - Configuração manual:
app.use(helmet.crossOriginOpenerPolicy())
9. Origin-Agent-Cluster
Ativa o isolamento de contexto de execução do navegador para proteger contra vazamento de memória e dados entre abas.
- Valor padrão:
?1 - Configuração manual:
app.use(helmet.originAgentCluster())
10. Content-Security-Policy (CSP)
Este é um dos cabeçalhos mais poderosos. Ele define exatamente quais fontes de conteúdo (scripts, imagens, estilos, etc.) podem ser carregadas. O CSP é eficaz contra ataques XSS e injeção de conteúdo, mas não é ativado por padrão no Helmet, pois pode quebrar funcionalidades mal configuradas.
- Exemplo de ativação manual: javascriptCopiarEditar
app.use(helmet.contentSecurityPolicy({ directives: { defaultSrc: ["'self'"], scriptSrc: ["'self'"], objectSrc: ["'none'"], upgradeInsecureRequests: [] } }))
Aplicando Proteções com Controle
É possível aplicar todos os cabeçalhos com configurações específicas de uma vez:
app.use(helmet({
contentSecurityPolicy: false, // pode ser configurado manualmente depois
frameguard: { action: 'sameorigin' },
hsts: { maxAge: 31536000, includeSubDomains: true, preload: true },
referrerPolicy: { policy: 'strict-origin-when-cross-origin' }
}))
Considerações Finais
Helmet é uma ferramenta essencial para elevar o nível de segurança das suas aplicações Node.js. Apesar de sua facilidade de uso, é fundamental entender o impacto de cada cabeçalho aplicado, principalmente em ambientes de produção com integração de terceiros, scripts externos e sistemas legados.
Recomenda-se começar com a configuração padrão do Helmet e, gradualmente, ativar políticas como CSP de maneira controlada, validando os impactos e ajustando conforme necessário.
Implementar boas práticas de segurança HTTP é um passo fundamental para construir sistemas robustos, confiáveis e alinhados com os princípios de defesa em profundidade.
