JavaScript é executado "inline", ou seja, na ordem em que aparece no DOM (se não fosse esse o caso, você nunca poderia ter certeza de que alguma variável definida em um script diferente estava visível quando você o usou pela primeira vez )
Isso significa que, em teoria, você poderia ter um script no início da página (ou seja, o primeiro <script>
elemento) que examina o DOM e remove todos os <script>
elementos e manipuladores de eventos dentro do seu <div>
.
Mas a realidade é mais complexa: o carregamento do DOM e do script ocorre de forma assíncrona. Isso significa que o navegador apenas garante que um script possa ver a parte do DOM que está antes dele (ou seja, o cabeçalho até agora em nosso exemplo). Não há garantias para nada além de (isso está relacionado a document.write()
). Então você pode ver a próxima tag de script ou talvez não.
Você poderia travar o onload
evento do documento - o que garantiria que você obtivesse todo o DOM - mas, naquele momento, o código malicioso já poderia ter sido executado. As coisas pioram quando outros scripts manipulam o DOM, adicionando scripts lá. Portanto, você também teria que verificar todas as alterações do DOM.
Portanto, a solução @cowls (filtragem no servidor) é a única solução que pode funcionar em todas as situações.