FlawOpen

flawopen.com/XSS em JavaScript/Svelte

Svelte é seguro contra XSS por padrão?

Página de referência
Em linguagem simples

Pense em `{comment}` como imprimir um bilhete: os sinais de menor e maior continuam visíveis como texto. `{@html comment}` é como pedir ao tipógrafo que trate os sinais da página como instruções de diagramação. Se vierem de uma fonte não confiável, o navegador poderá interpretá-los como HTML e causar XSS.

ARRISCADO
<p>{@html comment}</p>
// o valor é interpretado como marcação HTML
SEGURO
<p>{comment}</p>
// escapado automaticamente

A regra

Svelte compila a saída comum de {expression} como texto escapado; o valor não é interpretado como marcação HTML. Já {@html} renderiza uma string HTML de propósito. A documentação do Svelte alerta que, para evitar XSS, o valor deve ser escapado ou controlado. Trate-o como um ponto de inserção HTML sensível à segurança e use um sanitizador mantido quando precisar de texto rico escrito por usuários.

Como verificar seu código

Pesquise `{@html}` nos arquivos `.svelte`. Para cada ocorrência, rastreie a origem do valor e todas as transformações. Considere entrada de usuário, dados externos e conteúdo de usuário armazenado como não confiáveis. Se o conteúdo deve ser texto, use `{expression}`. Se HTML rico for necessário, sanitize-o com uma biblioteca HTML mantida e teste se a marcação não permitida é removida.

grep -rn "{@html" --include="*.svelte" .

HTML rico: preserve o limite da sanitização

Use `{expression}` quando o conteúdo deve aparecer como texto. Se leitores precisarem criar HTML, sanitize o conteúdo final com um sanitizador HTML mantido, como o DOMPurify, antes de passá-lo para `{@html}`. Não concatene nem altere o resultado sanitizado depois, pois isso pode invalidar a proteção. Mantenha o sanitizador atualizado e permita apenas os elementos e atributos de marcação necessários ao produto. A sanitização de HTML não torna o mesmo valor seguro em contextos JavaScript, CSS ou URL.

Referências

Veja também Cross-Site Scripting (XSS, CWE-79): como funciona e como evitar em todas as linguagens — flawopen.com Upload de SVG pode causar XSS? Risco de XSS no Vue v-html WKWebView: HTML não confiável é seguro? XSS refletido, armazenado e baseado em DOM: quais são as diferenças? Riscos de segurança do addJavascriptInterface no Android Proteção XSS do Angular: padrões seguros e APIs de bypass