Ola amigo desenvolvedor!
Quando você utiliza .innerHTML para manipular o conteúdo de um elemento HTML, o que acontece é que qualquer código HTML (inclusive tags de <script>) presente nesse conteúdo é interpretado e executado pelo navegador. Isso pode ser extremamente perigoso, pois permite que scripts maliciosos sejam injetados e executados no contexto da sua página, o que pode resultar em ataques como cross-site scripting (XSS).
Aqui está o que acontece, de forma mais detalhada:
- Com
innerHTML:- Quando você usa
.innerHTMLpara atribuir um valor a um elemento, o navegador interpreta o conteúdo e executa qualquer JavaScript incluído. Se um usuário mal-intencionado inserir código JavaScript, isso pode ser executado dentro do contexto da página. - Exemplo:
Se você não tiver cuidados, o código JavaScript do tipodocument.getElementById("element").innerHTML = "<img src='x' onerror='alert(\"XSS attack\")'>";onerrorserá executado, o que pode resultar em ações maliciosas.
- Quando você usa
- Com
textContent:- A propriedade
.textContentapenas insere texto puro no elemento, sem interpretar HTML. Ou seja, qualquer tentativa de incluir uma tag HTML ou script será tratada como texto comum, sem ser executada. - Exemplo:
Nesse caso, o conteúdo será exibido exatamente como texto:document.getElementById("element").textContent = "<img src='x' onerror='alert(\"XSS attack\")'>";
Ou seja, o código não é executado.<img src='x' onerror='alert("XSS attack")'>
- A propriedade
Resumo da diferença:
innerHTML: Executa o código HTML dentro do conteúdo, o que pode permitir a execução de scripts maliciosos.textContent: Insere o texto puro sem permitir que scripts ou HTML sejam executados, tornando-o mais seguro contra injeção de código malicioso.
Quando usar .textContent?
- Quando você estiver lidando com conteúdo fornecido pelo usuário ou de fontes externas, sempre utilize
.textContentpara evitar a execução de código malicioso.
Se precisar manipular conteúdo HTML (sem que haja risco de injeção de scripts), prefira usar métodos que escapem as entradas de maneira segura, comotextContent, ou utilize funções específicas de manipulação DOM, comocreateElementeappendChild, para garantir mais segurança.
Em resumo:
Se o objetivo é evitar injeção de scripts maliciosos e garantir que o conteúdo inserido seja tratado como texto puro, sempre prefira usar.textContentao invés de.innerHTML.
Um código seguro sempre é prioridade.
Bons estudos.