JavaScript se ejecuta "en línea", es decir, en el orden en que aparece en el DOM (si ese no fuera el caso, nunca podría estar seguro de que alguna variable definida en un script diferente estaba visible cuando la usaba por primera vez ).
Eso significa, en teoría, que podría tener un script al principio de la página (es decir, el primer <script>
elemento) que mira a través del DOM y elimina todos los <script>
elementos y controladores de eventos dentro de su<div>
.
Pero la realidad es más compleja: la carga de DOM y script ocurre de forma asincrónica. Esto significa que el navegador solo garantiza que un script pueda ver la parte del DOM que está antes (es decir, el encabezado hasta ahora en nuestro ejemplo). No hay garantías para nada más allá de (esto está relacionado con document.write()
). Por lo tanto, es posible que vea la siguiente etiqueta de secuencia de comandos o tal vez no.
Podría aferrarse al onload
evento del documento, lo que aseguraría que obtenga todo el DOM, pero en ese momento, el código malicioso ya podría haberse ejecutado. Las cosas empeoran cuando otros scripts manipulan el DOM y los agregan allí. Por lo tanto, también tendría que verificar cada cambio del DOM.
Así que la solución @cowls (filtrado en el servidor) es la única solución que puede funcionar en todas las situaciones.