/ TL;DR

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

  1. Grep dangerouslySetInnerHTML — cada resultado precisa de DOMPurify.
  2. Grep href={ e src={ — cada resultado precisa de validação de scheme.
  3. 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.

EV

Equipe Varredura

Time de pesquisa de segurança · Varredura

Sua app em produção passa por essa análise?

Rode uma varredura autônoma em ~60 segundos. Sem cadastro.

Analisar minha aplicação →