Proteger aplicações web contra ataques cibernéticos deixou de ser uma preocupação secundária para se tornar uma exigência fundamental de qualquer projeto de software. Em 2025, o OWASP atualizou seu famoso Top 10, incluindo duas novas categorias de risco e consolidando outras, o que mostra que o cenário de ameaças evolui constantemente. Se você desenvolve ou mantém qualquer sistema exposto à internet, precisa entender essas vulnerabilidades e, mais importante, saber como se defender delas na prática.
Trabalho com desenvolvimento web há mais de 8 anos e, nesse tempo, já vi aplicações serem comprometidas por falhas que pareciam triviais — um campo de formulário sem sanitização, uma rota de API sem autenticação adequada, um header de segurança esquecido. O pior é que a maioria dessas brechas poderia ter sido evitada com práticas básicas que muitos times simplesmente ignoram por pressa ou desconhecimento. Nos últimos dois anos, passei a adotar um checklist de segurança em todos os projetos, e a diferença na qualidade e na confiança do código é absurda.
O Que Mudou no OWASP Top 10:2025
O OWASP Top 10:2025 analisou mais de 175 mil registros de CVEs para determinar os riscos mais críticos. A lista trouxe mudanças significativas em relação à edição de 2021, refletindo como os ataques se adaptam às novas tecnologias e práticas de desenvolvimento.
A principal novidade é a inclusão de duas categorias inéditas: Software Supply Chain Failures (A03), que aborda riscos na cadeia de suprimentos de software — como dependências comprometidas e pacotes maliciosos no npm ou PyPI —, e Mishandling of Exceptional Conditions (A10), que foca em tratamento inseguro de erros, condições lógicas inesperadas e cenários de falha que abrem brechas. Além disso, o Server-Side Request Forgery (SSRF) foi consolidado dentro de Broken Access Control (A01), que manteve a posição de risco número um.
Security Misconfiguration subiu da quinta para a segunda posição, afetando cerca de 3% das aplicações testadas. Isso inclui desde permissões excessivas em buckets de armazenamento na nuvem até headers HTTP ausentes e configurações padrão inseguras em frameworks. É um alerta claro: não basta escrever código seguro, a infraestrutura e a configuração precisam acompanhar.
| Posição 2025 | Categoria | Mudança vs 2021 |
|---|---|---|
| A01 | Broken Access Control | Manteve #1 (absorveu SSRF) |
| A02 | Security Misconfiguration | Subiu de #5 |
| A03 | Software Supply Chain Failures | Nova categoria |
| A04 | Cryptographic Failures | Caiu de #2 |
| A05 | Injection | Caiu de #3 |
| A06 | Insecure Design | Caiu de #4 |
| A07 | Authentication Failures | Manteve posição |
| A08 | Software and Data Integrity Failures | Manteve posição |
| A09 | Security Logging and Monitoring Failures | Manteve posição |
| A10 | Mishandling of Exceptional Conditions | Nova categoria |
Broken Access Control: O Risco Número Um
Broken Access Control continua sendo a vulnerabilidade mais prevalente, com uma média de 3,73% das aplicações testadas apresentando pelo menos uma falha nessa categoria. O problema acontece quando um usuário consegue acessar recursos ou executar ações para as quais não tem permissão — e isso é mais comum do que parece.
Na prática, isso inclui cenários como: manipulação de IDs em URLs para acessar dados de outros usuários (IDOR), endpoints de API que não validam o papel do usuário, escalação de privilégios por falta de verificação no backend, e acesso direto a páginas administrativas sem autenticação. A consolidação do SSRF nessa categoria reforça a gravidade: um atacante pode fazer o servidor enviar requisições internas, acessando serviços que não deveriam estar expostos.
Como Mitigar
- Negue por padrão: toda rota e recurso deve ser inacessível até que uma permissão explícita seja concedida. Nunca assuma que o frontend protege o acesso.
- Valide no backend: toda verificação de autorização deve acontecer no servidor. Verificações no cliente são complementares, não substitutas.
- Use controle de acesso baseado em roles (RBAC): defina papéis claros e associe permissões granulares a cada um.
- Teste com ferramentas automatizadas: use scanners como OWASP ZAP ou Burp Suite para identificar falhas de controle de acesso em rotas e endpoints.
- Registre e monitore: toda tentativa de acesso não autorizado deve gerar um log de alerta para análise posterior.
Injection e XSS: Velhos Conhecidos Que Persistem
Apesar de frameworks modernos oferecerem proteção nativa contra muitos tipos de injeção, essas vulnerabilidades continuam no Top 10 (agora em A05). SQL Injection, NoSQL Injection, Command Injection e Cross-Site Scripting (XSS) ainda afetam milhares de aplicações, especialmente aquelas que concatenam input de usuário diretamente em queries ou templates.
O XSS, em particular, continua sendo explorado em aplicações que renderizam HTML dinâmico sem escapar caracteres especiais. Ataques de XSS armazenado podem comprometer todos os usuários que acessam uma página afetada, permitindo roubo de cookies de sessão, redirecionamento para sites maliciosos e execução arbitrária de JavaScript no navegador da vítima.
Defesas Práticas Contra Injeção
- Use queries parametrizadas: nunca concatene variáveis diretamente em SQL. Utilize prepared statements ou ORMs que fazem isso automaticamente.
- Sanitize e valide inputs: toda entrada de usuário deve ser validada no servidor quanto a tipo, tamanho e formato esperado. Rejeite o que não se encaixa.
- Escape output: ao renderizar dados no HTML, use as funções de escape do framework (React faz isso por padrão com JSX, mas
dangerouslySetInnerHTMLanula a proteção). - Implemente Content Security Policy (CSP): o header
Content-Security-Policylimita de onde scripts podem ser carregados, bloqueando a execução de código injetado. - Use bibliotecas de sanitização: para casos em que HTML do usuário é permitido (editores rich text), use libs como DOMPurify para limpar o conteúdo antes da renderização.
Web Application Firewall: A Camada Extra de Proteção
Um Web Application Firewall (WAF) funciona como um escudo entre a internet e sua aplicação, filtrando e monitorando o tráfego HTTP para bloquear ataques conhecidos antes que eles cheguem ao seu código. Segundo a documentação da OWASP sobre WAFs, essa camada é especialmente útil para proteger contra injeção SQL, XSS e tentativas de exploração de vulnerabilidades conhecidas.
Em 2026, as melhores soluções de WAF combinam dois modelos de segurança: o modelo negativo (blacklisting), que bloquei o que é conhecido como malicioso, e o modelo positivo (whitelisting), que permite apenas o que é explicitamente válido. A combinação de regras gerenciadas com regras customizadas específicas para sua aplicação oferece o melhor equilíbrio entre segurança e usabilidade.
Boas Práticas para WAF
- Virtual Patching: quando uma vulnerabilidade é descoberta no código e a correção ainda não foi implementada, o WAF pode bloquear tentativas de exploração diretamente, ganhando tempo para o time de desenvolvimento.
- Rate Limiting: configure limites de requisições por IP para endpoints sensíveis (login, reset de senha, APIs de dados), mitigando ataques de força bruta e DDoS na camada de aplicação.
- Tuning contínuo: um WAF mal configurado pode bloquear requisições legítimas. Revise regularmente os logs de bloqueio e ajuste as regras para minimizar falsos positivos sem comprometer a segurança.
- Infraestrutura como código: configure o WAF usando ferramentas como Terraform ou Ansible para garantir que as regras sejam versionadas, auditáveis e replicáveis entre ambientes.
Serviços como Cloudflare WAF oferecem planos gratuitos que já incluem proteção básica contra ataques comuns, tornando essa camada acessível mesmo para projetos menores.
Autenticação e Gerenciamento de Sessão
Authentication Failures (A07) abrange problemas como senhas fracas permitidas, falta de autenticação multifator (MFA), tokens de sessão previsíveis e falhas no fluxo de recuperação de senha. A boa notícia é que o uso crescente de frameworks padronizados de autenticação (como NextAuth, Auth0, Clerk e Supabase Auth) tem reduzido a incidência dessas falhas — mas só quando são configurados corretamente.
- Implemente MFA: autenticação multifator deve ser obrigatória para contas administrativas e disponível para todos os usuários. TOTP (Google Authenticator) e WebAuthn (chaves de segurança) são as opções mais seguras.
- Gerencie sessões adequadamente: tokens devem ser gerados com entropia criptográfica suficiente, ter tempo de expiração definido, e ser invalidados no logout. Use cookies com flags
HttpOnly,SecureeSameSite=Strict. - Limite tentativas de login: implemente lockout temporário ou CAPTCHA após um número definido de tentativas falhas para prevenir ataques de força bruta.
- Proteja o fluxo de recuperação: links de reset de senha devem ser de uso único, ter expiração curta (máximo 1 hora) e não revelar se o email existe na base.
Headers de Segurança HTTP: Proteção Gratuita e Subutilizada
Uma das formas mais simples e eficazes de proteger uma aplicação web é configurar corretamente os headers de segurança HTTP. Muitos desenvolvedores simplesmente não sabem que eles existem ou subestimam seu impacto. Segundo o MDN Web Docs sobre segurança web, esses headers fornecem uma camada de defesa com zero impacto no desempenho.
| Header | Finalidade | Valor Recomendado |
|---|---|---|
| Content-Security-Policy | Controla origens de scripts, estilos e recursos | Restritivo, específico por app |
| Strict-Transport-Security | Força HTTPS em todas as requisições | max-age=31536000; includeSubDomains |
| X-Content-Type-Options | Impede MIME type sniffing | nosniff |
| X-Frame-Options | Previne clickjacking | DENY ou SAMEORIGIN |
| Referrer-Policy | Controla informações enviadas no Referer | strict-origin-when-cross-origin |
| Permissions-Policy | Restringe acesso a APIs do navegador | camera=(), microphone=(), geolocation=() |
Em frameworks como Next.js, esses headers podem ser configurados no next.config.js ou no middleware. Em aplicações Express, o pacote helmet configura a maioria deles com uma única linha de código. Não há desculpa para não implementar.
Supply Chain Security: O Novo Vetor de Ataque
A inclusão de Software Supply Chain Failures como A03 no OWASP Top 10:2025 reflete uma realidade preocupante: ataques à cadeia de suprimentos de software explodiram nos últimos anos. Pacotes maliciosos no npm, PyPI e outros registros, dependências comprometidas, e até plugins de CI/CD adulterados representam um vetor de ataque que muitos times ignoram.
Segundo o blog do GitLab sobre as mudanças no OWASP 2025, essa categoria engloba desde o uso de dependências com vulnerabilidades conhecidas até a falta de verificação de integridade em pipelines de build. A confiança cega em pacotes de terceiros é, por si só, uma vulnerabilidade.
Medidas de Proteção
- Audite dependências regularmente: use
npm audit,pip auditousnykpara identificar vulnerabilidades conhecidas em suas dependências. - Fixe versões: use lockfiles (
package-lock.json,poetry.lock) e evite ranges abertos como^ou~em produção. - Verifique integridade: habilite
npm config set audit-level=highe bloqueie instalações que falhem na verificação de integridade. - Revise novas dependências: antes de adicionar um pacote, verifique seu número de downloads, mantenedores, última atualização e se tem issues de segurança abertas.
- Use Software Bill of Materials (SBOM): gere e mantenha um inventário atualizado de todas as dependências e suas versões para rastreabilidade.
Monitoramento e Resposta a Incidentes
Security Logging and Monitoring Failures (A09) trata da capacidade — ou falta dela — de detectar e responder a ataques em andamento. Sem logs adequados e monitoramento em tempo real, uma aplicação pode estar sendo atacada por semanas antes que alguém perceba. E quando perceber, os dados já foram exfiltrados.
- Registre eventos de segurança: logins, falhas de autenticação, tentativas de acesso não autorizado, alterações de permissão e operações administrativas devem gerar logs estruturados.
- Centralize logs: use ferramentas como ELK Stack, Grafana Loki ou Datadog para agregar logs de todos os serviços em um único lugar pesquisável.
- Configure alertas: defina thresholds para eventos suspeitos — múltiplas tentativas de login falhas do mesmo IP, acessos a rotas administrativas de IPs desconhecidos, picos anormais de requisições.
- Tenha um plano de resposta: documente o procedimento a ser seguido quando um incidente é detectado: quem é notificado, como o ataque é contido, como a comunicação é feita e como a recuperação acontece.
- Teste sua detecção: periodicamente, simule ataques controlados para verificar se seus sistemas de monitoramento e alerta funcionam como esperado.
Checklist Prático de Segurança Para Seu Projeto
Compilei um checklist baseado no que aplico nos meus próprios projetos e que cobre as vulnerabilidades mais comuns do OWASP Top 10:2025. Não é exaustivo, mas cobre o básico que todo projeto web deveria ter antes de ir para produção:
- Todas as rotas e endpoints têm verificação de autorização no backend
- Inputs de usuário são validados e sanitizados no servidor
- Queries ao banco usam prepared statements ou ORM com parametrização
- Headers de segurança HTTP estão configurados (CSP, HSTS, X-Frame-Options etc.)
- Autenticação multifator está disponível e ativa para contas admin
- Sessões têm expiração definida e são invalidadas no logout
- Dependências foram auditadas e lockfiles estão commitados
- WAF ou rate limiting está configurado para endpoints sensíveis
- Logs de segurança são gerados e centralizados
- Alertas automáticos estão configurados para eventos suspeitos
- HTTPS é forçado em todas as conexões (HSTS habilitado)
- Dados sensíveis são criptografados em repouso e em trânsito (AES-256 / TLS 1.3)
- Backups são realizados regularmente e testados para restauração
- Testes de segurança automatizados rodam no pipeline de CI/CD
Conclusão
Proteger aplicações web não é um evento pontual — é um processo contínuo que exige atenção constante às novas ameaças e atualização das defesas. O OWASP Top 10:2025 deixa claro que, embora algumas vulnerabilidades clássicas como injeção e falhas de autenticação persistam, novos vetores como ataques à cadeia de suprimentos de software ganham relevância a cada ano. A defesa em profundidade — múltiplas camadas de proteção em vez de uma solução única — continua sendo a abordagem mais eficaz. Na minha experiência, o maior diferencial entre projetos seguros e vulneráveis não é a sofisticação das ferramentas usadas, mas sim a disciplina do time em aplicar práticas básicas de forma consistente. Comece pelo checklist, implemente as defesas mais simples primeiro (headers, parametrização, WAF básico) e evolua gradualmente. Segurança perfeita não existe, mas negligência é uma escolha.

