Вот небольшой шаткий код JavaScript, который выделился при обзоре полезной нагрузки вредоносной рекламы:
(function (a) { return a && a.parentNode && a.parentNode.removeChild(a) })(document.currentScript)
Давайте немного разберемся:
Метод Node.removeChild()
удаляет дочерний узел из DOM. Возвращает удаленный узел.
document.currentScript — возвращает элемент <script>
, сценарий которого обрабатывается в данный момент.
Так может быть, сценарий может удалить тег, который его вызвал, и продолжить работу? Оказывается, да. Если на первый взгляд это немного удивительно, возможно, это потому, что в этом нет особой необходимости, если, возможно, вам нечего скрывать.
Факт остается фактом: DOM сохраняет состояние и может изменяться, в то время как сам JavaScript работает в памяти. Эти двое никак не связаны друг с другом. Иногда легко упустить из виду, что это две совершенно разные сущности.
Давайте проверим это:
А теперь доказательство:
Похоже, все прошло по плану! Наш скрипт выполнил document.write, удалил себя из DOM, но все же смог продолжить выполнение и выполнить следующий document.write.