Skip to main content
Blog
Blog security

O que é DOM-based XSS? Como funciona o cross-site scripting no DOM

DOM-based XSS é um ataque de cross-site scripting em que a vulnerabilidade vive inteiramente no JavaScript client-side: o próprio código da página lê entradas controladas pelo atacante e as escreve no DOM de forma insegura. Este guia explica como ele difere do XSS refletido e armazenado, os sources e sinks mais comuns, e como detectá-lo.

Aug 18, 2026 3 min read
O que é DOM-based XSS? Como funciona o cross-site scripting no DOM
Índice

DOM-based XSS é uma vulnerabilidade de cross-site scripting que vive inteiramente no código client-side. O próprio JavaScript da página lê entradas controláveis pelo atacante — na maioria das vezes a partir da URL — e as escreve no DOM através de um sink inseguro como innerHTML, executando o script do atacante. Diferentemente do XSS refletido ou armazenado, o payload malicioso pode nunca aparecer em nenhuma resposta do servidor.

Como funciona um ataque de DOM XSS?

A vulnerabilidade é um fluxo de dados de um source que o atacante controla para um sink que interpreta texto como código ou marcação:

// vulnerable: fragment flows straight into a sink
const name = decodeURIComponent(location.hash.slice(1));
document.querySelector("#welcome").innerHTML = "Hello " + name;
// https://example.com/#<img src=x onerror=stealCookies()>

Sources comuns: location.hash, location.search, document.referrer, window.name, dados de postMessage e armazenamento client-side. Sinks comuns: innerHTML/outerHTML, document.write, eval e Function, o .html() do jQuery, e escritas de atributos que criam manipuladores ou URLs (onclick, href com javascript:).

Como o fragmento da URL nunca é enviado ao servidor, um payload após o # pode explorar a página enquanto o servidor vê uma requisição perfeitamente normal.

XSS refletido vs armazenado vs DOM-based

XSS refletidoXSS armazenadoDOM-based XSS
Onde o payload viveNa requisição, ecoado pelo servidorNo banco de dados do servidorNa entrada client-side (muitas vezes o fragmento da URL)
A resposta do servidor contém o payload?Muitas vezes ✗
Visível para WAFs / logs do servidorGeralmenteGeralmenteMuitas vezes não
Onde é corrigidoCodificação de saída no servidorSanitização + codificação no servidorCódigo client-side: sinks seguros, sanitização

Por que o DOM XSS é fácil de passar despercebido

As defesas do lado do servidor inspecionam requisições e respostas; o DOM XSS pode contornar ambas. Os frameworks reduzem o risco — React e afins fazem escape por padrão — mas dangerouslySetInnerHTML, o mau uso de templates e os scripts de terceiros na página o reintroduzem. E uma página moderna executa dezenas de scripts que você não escreveu: um sink inseguro em qualquer um deles é um sink inseguro na sua página. Esse problema de composição é o cerne da segurança client-side.

Como prevenir e detectar

  • Prefira sinks seguros: textContent em vez de innerHTML; evite completamente eval e manipuladores construídos com strings.
  • Sanitize quando o HTML for inevitável (DOMPurify ou a emergente Sanitizer API), e adote Trusted Types onde houver suporte — eles transformam escritas em sinks inseguros em violações de política.
  • Implante uma Content Security Policy rigorosa com nonces; ela bloqueia muitos estilos de payload, embora não toda a classe de ataque.
  • Observe o comportamento em tempo de execução: a exploração acaba se manifestando como scripts fazendo coisas que não deveriam — novas requisições de saída, escritas no DOM em formulários de pagamento, listeners inesperados. O monitoramento client-side da cside observa sessões reais na camada do navegador, que é o único lugar onde um ataque restrito ao DOM é sequer visível.
Simon Wijckmans
Founder & CEO

Founder and CEO of cside. Previously a product manager on Cloudflare Page Shield (now Cloudflare Client-Side Security). Co-chair of the W3C Anti-Fraud Community Group and a Forbes 30 Under 30 honoree. Building accessible security against client-side attacks, web security is not an enterprise-only problem.

FAQ

Frequently Asked Questions

No XSS refletido, o payload malicioso viaja até o servidor e volta embutido na resposta HTML. No DOM-based XSS, a resposta do servidor pode estar completamente limpa: o próprio JavaScript da página lê o payload de um source client-side (muitas vezes o fragmento da URL, que nunca é enviado ao servidor) e o injeta no DOM. É por isso que filtros do lado do servidor e WAFs, que inspecionam requisições e respostas, podem deixar passar o DOM XSS por completo.

Ajuda, mas não fecha a classe de ataque. Uma Content Security Policy rigorosa bloqueia a injeção de scripts inline e origens não confiáveis, o que derrota muitos payloads. Mas um DOM XSS executado através de um sink inseguro de um script na lista de permitidos — ou um payload que abusa de um recurso permitido do framework — permanece dentro da política. A CSP é uma camada forte; não substitui corrigir os sinks inseguros nem observar o que os scripts realmente fazem em tempo de execução.

De forma estática, auditando os caminhos do código dos sources (location.hash, location.search, document.referrer, dados de postMessage) até os sinks (innerHTML, document.write, eval, setAttribute de manipuladores de eventos). De forma dinâmica, com scanners conscientes do DOM e monitorando sessões reais em busca de comportamento inesperado de scripts — a vulnerabilidade só existe no navegador, então a visibilidade na camada do navegador é onde a exploração se torna observável.

Monitore e proteja seus scripts de terceiros

Gain full visibility and control over every script delivered to your users to enhance site security and performance.

Comece grátis ou experimente o Business com um teste de 14 dias.

Interface do painel cside mostrando monitoramento de scripts e análises de segurança
Related Articles
Agende uma demonstração

Quer ver isso em detalhe com um engenheiro?

Trinta minutos, no seu próprio site. Sem slides.

Vamos mostrar:

Quais scripts de terceiros estão rodando no seu site agora
Como você está em relação aos requisitos 6.4.3 e 11.6.1 do PCI DSS
Qual parte do seu tráfego é de bots e agentes de IA

Prefere só mandar uma pergunta?

Procurando horários livres…

Apenas humanos de verdade. A gente saberia.

Problemas para agendar? Abrir o agendador em uma nova aba

O que você está tentando resolver?

Conte em uma linha e voltamos com algo útil, não com um discurso genérico.

Costumamos ajudar com:

Ver quais scripts de terceiros rodam no seu site
Evidências para PCI DSS 6.4.3 e 11.6.1
Bots, agentes de IA e roubo de contas

Prefere agendar um horário? Escolher um horário