Segurança

Segurança

O Veloz fecha por padrão as brechas de XSS mais comuns, no navegador e na renderização no servidor.

Texto nunca vira HTML

Strings no JSX entram como nós de texto no navegador e são escapadas (& < > " ') no servidor. Entrada do usuário não consegue criar elementos.

tsx
const name = '<img src=x onerror=alert(1)>';
<p>Olá, {name}</p>; // mostra o texto, não executa nada

innerHTML é sanitizado

O innerHTML sempre passa pelo sanitize(): lista de tags e atributos permitidos, sem handlers on*, sem srcdoc, URLs inseguras trocadas por about:blank e rel="noopener noreferrer" nos links. Com Trusted Types disponível, a saída é embrulhada numa política veloz-sanitize.

tsx
import { sanitize } from '@velozjs/dom';

<article innerHTML={markdownHtml} />;                // sanitizado automaticamente
sanitize(html, { allowedTags: new Set(['b', 'i']) }); // mais restrito, à mão

No servidor, o innerHTML não é impresso; o cliente o define na hidratação.

URLs não executam script

href, src, action, formaction, srcset, poster, xlink:href e outros atributos de URL são verificados por uma única função, no cliente, no sanitizador e no SSR. Ela remove primeiro os caracteres que os navegadores ignoram ao ler o esquema da URL, então truques como java\tscript: são pegos.

  • javascript: e vbscript: são sempre bloqueados.
  • data: só é aceito para imagens raster (png, gif, jpeg, webp, avif, bmp) em src, poster e srcset.
  • Um valor rejeitado remove o atributo em vez de deixar um valor antigo no lugar.

Nomes de atributo são validados

Nomes com espaços, aspas, = ou > são rejeitados, então espalhar props vindas de dados que você não controla não injeta markup. O SSR também valida nomes de tag.

Handlers são funções

Handlers em string como onclick="..." são rejeitados. Os handlers ficam guardados fora do DOM e nunca são impressos pelo SSR.

CSP

Sem eval, new Function, document.write ou scripts inline. Os estilos em tempo de execução usam uma folha de estilo construída via JS. O CSS do servidor escapa </style, e o script de dados do renderToStringAsync escapa <, > e & e aceita um nonce.

O que continua sendo com você

  • A verificação de URL bloqueia execução de script, não redirecionamentos abertos: valide destinos que vêm do usuário.
  • Não coloque entrada não confiável em css ou style sem validar; não executa script, mas pode mudar a página.

Encontrou uma vulnerabilidade? Reporte em particular pelos avisos de segurança do GitHub.