React, Vue e Svelte escapam HTML por default. Isso não significa que XSS acabou. Analisamos 4 vetores que ainda funcionam em apps modernos e o padrão de defesa que passa direto por bibliotecas comuns.
React, Vue e Svelte tornaram XSS raro em componentes idiomáticos. Mas raro não é zero. Estes são os 4 vetores que ainda aparecem em apps modernos.
Vetor 1: dangerouslySetInnerHTML sem sanitização
Sempre que o dev quer renderizar HTML rico do usuário (markdown, editor rich-text), ele foge do JSX e cai em dangerouslySetInnerHTML. Sem DOMPurify, é XSS armazenado.
Correção: sempre DOMPurify.sanitize(html). Sem exceção.
Vetor 2: Atributo href derivado de input
<a href={user.website}>{user.website}</a>
Se user.website = "javascript:alert(1)", o click executa JS.
Correção: valide o scheme. Só https:// e http://. Rejeite javascript:, data:, vbscript:.
Vetor 3: SVG inline com input
Renderizar SVG do usuário como componente é XSS latente. SVG aceita <script> e handlers onclick.
Correção: sanitize SVG com biblioteca dedicada. Ou converta pra PNG server-side.
Vetor 4: JSON incorporado no HTML server-side
Padrão comum em SSR:
<script>window.__PRELOAD__ = {json aqui};</script>
Se o JSON contém </script><script>alert(1)</script>, quebra o parser. XSS reflected.
Correção: escape o < no JSON (<). Frameworks SSR modernos fazem isso, mas o padrão manual falha.
Vetor bonus: CSP não bloqueia inline
Muitos apps têm CSP mas com unsafe-inline. Isso torna CSP quase inútil para XSS.
Correção: CSP com nonce ou hash. Sem unsafe-inline.
Como auditar em 15 minutos
- Grep
dangerouslySetInnerHTML— cada resultado precisa de DOMPurify. - Grep
href={esrc={— cada resultado precisa de validação de scheme. - Ver header CSP — se tem
unsafe-inline, é hora de refatorar.
Impacto: por que XSS ainda importa
XSS não vai roubar seu banco de dados. Mas pode:
- Sequestrar sessão do usuário.
- Fazer chamadas autenticadas em nome dele.
- Instalar keylogger via extensão.
- Redirecionar pra phishing convincente (mesmo domínio).
Em apps B2B, XSS num admin panel = tomada da conta corporativa inteira.
TL;DR
- 4 vetores ainda passam mesmo em React/Vue.
- DOMPurify em qualquer HTML de usuário.
- Valide scheme em href/src.
- CSP sem
unsafe-inline.
A Varredura injeta payloads XSS em todos os campos e valida se o browser executa. Testar agora.
Sua app em produção passa por essa análise?
Rode uma varredura autônoma em ~60 segundos. Sem cadastro.